创建项目Secret Message
strings.xml
<resources><string name="app_name">Secret Message</string><string name="welcome_text">Welcome to the Secret Message app!Use this app to encrypt a secret message.Click on the Start button to begin.</string><string name="start">Start</string><string name="message_hint">Please enter your secret message</string><string name="next">Next</string><string name="encrypt_text">Here is your encrypted message:</string><!-- TODO: Remove or change this placeholder text --><string name="hello_blank_fragment">Hello blank fragment</string>
</resources>
为项目添加名为WelcomeFragment
的片段
IDEA菜单栏“New” -> “Fragment” -> “Fragment(Blank)”
打开WelcomeFragment.kt
发现片段的代码看起来类似活动代码,重点是onCreateView
方法返回一个View
,等价于活动的setContentView
方法
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_welcome, container, false)}
修改布局文件fragment_welcome.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center_horizontal"tools:context=".WelcomeFragment"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:layout_marginTop="20dp"android:textSize="20sp"android:text="@string/welcome_text" /><Buttonandroid:id="@+id/start"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="32dp"android:text="@string/start" />
</LinearLayout>
修改activity_main.xml
包含一个FragmentContainerView
节点以使用片段WelcomeFragment
<?xml version="1.0" encoding="utf-8"?>
<androidx.fragment.app.FragmentContainerViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/fragment_container_view"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="16dp"android:name="com.demo.secretmessage.WelcomeFragment"tools:context=".MainActivity" />
要让MainActivity
显示一个片段并不需要为MainActivity.kt
增加额外代码,因为布局activity_main.xml
的FragmentContainerView
会处理所有工作
只需要确保MainActivity.kt
有以下代码即可
package com.demo.secretmessageimport androidx.appcompat.app.AppCompatActivity
import android.os.Bundleclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)}
}
运行查看效果
接着创建一个新的片段MessageFragment
修改MessageFragment
的布局文件fragment_message.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="16dp"android:orientation="vertical"android:gravity="center_horizontal"tools:context=".MessageFragment"><EditTextandroid:id="@+id/message"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20sp"android:hint="@string/message_hint"android:inputType="textMultiLine" /><Buttonandroid:id="@+id/next"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="@string/next" />
</LinearLayout>
打开MessageFragment.kt
确保有以下代码即可
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_message, container, false)}
让WelcomeFragment
片段导航到MessageFragment
片段:使用导航(Navigation)
组件
导航包含3个主要部分
1.导航图
2.导航宿主
3.导航控制器
创建导航图
方式1
在项目资源管理器中选择/app/src/main/res
,然后选择“File” -> “Android Resource File”
输入文件名nav_graph
,资源类型选择Navigation
或者 方式2
弹出提示需要添加依赖
点击"OK",build.gradle
文件会把navigation
相应的依赖加入去
选择"fragment_welcome"为导航图添加WelcomeFragment
接着再点击新建,选择"fragment_message"为导航图添加MessageFragment