Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,让单 Activity 应用成为首选架构。应用内Fragment页面的跳转则由 Navigation 来处理,开发者无需在处理 FragmentTransaction 的复杂性以及相关的转场动画。
在app的gradle.build中添加依赖:
def nav_version = "2.3.5"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
在activity布局文件中加入FragmentContainerView:
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"/>
name为固定写法,必须指明为
androidx.navigation.fragment.NavHostFragment
defaultNavHost字段表示是否拦截返回按键操作
若为true,需要的Activity中重写onSupportNavigateUp方法。
默认情况下返回键是不会回退fragment页面的,完成即可使用回退键返回fragment页面。
override fun onSupportNavigateUp(): Boolean {
//调用扩展函数findNavController
return findNavController(R.id.nav_host_fragment).navigateUp()
}
需要设置navGraph导航图文件,继续在res文件夹下创建nav_graph.xml文件,定义相关fragment和各自的跳转逻辑。
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/fragment_home">
<fragment
android:id="@+id/fragment_home"
android:name="com.example.navigationuse.HomeFragment"
tools:layout="@layout/fragment_home">
<action android:id="@+id/fragment_home_to_fragment_msg"
app:destination="@+id/fragment_msg"/>
</fragment>
<fragment
android:id="@+id/fragment_msg"
android:name="com.example.navigationuse.MsgFragment"
tools:layout="@layout/fragment_msg">
<action android:id="@+id/fragment_msg_to_fragment_home"
app:destination="@+id/fragment_home"/>
<action android:id="@+id/fragment_msg_to_fragment_mine"
app:destination="@+id/fragment_mine"/>
</fragment>
<fragment
android:id="@+id/fragment_mine"
android:name="com.example.navigationuse.MineFragment"
tools:layout="@layout/fragment_mine">
<action android:id="@+id/fragment_mine_to_fragment_msg"
app:destination="@+id/fragment_msg"/>
</fragment>
</navigation>
导航图实现了3个fragment之间的前后跳转,设置要跳转的action。由于fragment代码简单,这里就不贴出来了。
跳转页面通过NavController来控制:
btnHome.setOnClickListener {
//通过传入action来实现导航
Navigation.findNavController(btnHome).navigate(R.id.fragment_home_to_fragment_msg)
}
跳转传递参数
var args = Bundle()
args.putString("params", "params")
Navigation.findNavController(btnHome).navigate(R.id.fragment_home_to_fragment_msg, args)
目标页接收参数:
var params = arguments?.getString("params")
网友评论