2018年Google I/O大会中推出的一个新的架构组件。
在此之前我使用过类似这种单Fragment构建App的框架,Zhuinden/simple-stack ,但是官方出手,最为致命,
本着不得不学的态度,我有必要去学习和使用它。
首先我们需要导入lib
implementation "androidx.navigation:navigation-fragment-ktx:2.0.0"
implementation "androidx.navigation:navigation-ui-ktx:2.0.0"
创建2个Fragment
class Page1Fragment:Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_page_1,container,false)
}
}
class Page2Fragment:Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_page_2,container,false)
}
}
这两个Fragment都只有一个Button
在res文件夹下创建一个navigation文件夹
在这个文件夹下创建一个xml
如果没有该选项,可以在File ------> other Settings -->default Settings Experimental 中勾选Enable Navigation Editor
重启Android Studio 即可
创建完xml 切换到Design视图,点击Add 添加你想要操作的Fragment
切换回Text视图
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/test_navigation"
app:startDestination="@id/page1Fragment">
<fragment
android:id="@+id/page1Fragment"
android:name="sample.xietaichen.testnavigation.Page1Fragment"
android:label="Page1Fragment">
</fragment>
<fragment
android:id="@+id/page2Fragment"
android:name="sample.xietaichen.testnavigation.Page2Fragment"
android:label="Page2Fragment">
</fragment>
</navigation>
给page1Fragment 添加action
<action android:id="@+id/gotopage2"
app:destination="@id/page2Fragment"
/>
Action的属性
id: action的id,作为此action的唯一标识了
destination 属性表示你要跳转的fragment,直接打开新的
launchSingleTop: false or true 是否将这个fragment 的启动模式设置为SingleTop 默认为false
popUpTo 跳转到已存在的指定的fragment ,如果不存在,不会跳转,也不会报错
提示:
Ignoring popBackStack to destination sample.xietaichen.testnavigation:id/page2Fragment as it was not found on the current back stack
转场动画:
enterAnim
exitAnim
popEnterAnim
popExitAnim
在点击事件中说那个这个action :
button2.setOnClickListener {
Navigation.findNavController(it).navigate(R.id.to_page2)
}
这样就是使用了之前定义的action
想要执行类似Activity 的finish 功能可以这样
Navigation.findNavController(it).navigateUp()