导航的使用
导航组件基本使用
- 添加依赖
dependencies {
val nav_version = "2.3.5"
// Java language implementation
implementation("androidx.navigation:navigation-fragment:$nav_version")
implementation("androidx.navigation:navigation-ui:$nav_version")
// Kotlin
implementation("androidx.navigation:navigation-fragment-ktx:$nav_version")
implementation("androidx.navigation:navigation-ui-ktx:$nav_version")
// Feature module Support
implementation("androidx.navigation:navigation-dynamic-features-fragment:$nav_version")
// Testing Navigation
androidTestImplementation("androidx.navigation:navigation-testing:$nav_version")
// Jetpack Compose Integration
implementation("androidx.navigation:navigation-compose:2.4.0-alpha03")
}
- 在/res/Navigation/下面的xml文件(navGraph)中配置对应的fragment、activity,并编写对应的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/mobile_navigation"
app:startDestination="@+id/navigation_home">
<fragment
android:id="@+id/navigation_home"
android:name="com.joye.wapp.ui.home.HomeFragment"
android:label="@string/title_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/navigation_dashboard"
android:name="com.joye.wapp.ui.dashboard.DashboardFragment"
android:label="@string/title_pj"
tools:layout="@layout/fragment_dashboard" />
<fragment
android:id="@+id/navigation_notifications"
android:name="com.joye.wapp.ui.notifications.NotificationsFragment"
android:label="@string/title_me"
tools:layout="@layout/fragment_notifications" />
</navigation>
其中navigation有一个启动的属性app:startDestination="@+id/navigation_home",用来指定第一fragment.
编写menu,用来标识底部导航。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/navigation_home"
android:icon="@drawable/ic_home_black_24dp"
android:title="@string/title_home" />
<item
android:id="@+id/navigation_dashboard"
android:icon="@drawable/ic_dashboard_black_24dp"
android:title="@string/title_pj" />
<item
android:id="@+id/navigation_notifications"
android:icon="@drawable/ic_notifications_black_24dp"
android:title="@string/title_me" />
</menu>
-
在activity的布局中,会有BottomNavigationView,androidx.navigation.fragment.NavHostFragment需要使用以下两个配置信息分别指定menu和vavGraph。
//BottomNavigationView中 指定底部的meun app:menu="@menu/bottom_nav_menu" //NavHostFragment中指定需要导航的navGraph app:navGraph="@navigation/mobile_navigation" -
最后在activity中关联NavHostFragment和BottomNavigationView
val navController = findNavController(R.id.nav_host_fragment) // Passing each menu ID as a set of Ids because each // menu should be considered as top level destinations. val appBarConfiguration = AppBarConfiguration(setOf( R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)) setupActionBarWithNavController(navController, appBarConfiguration) navView.setupWithNavController(navController) -
跳转
//导航到对应的action的id中去。 view.findNavController().navigate(R.id.action_global_mainFragment)
总结
- 引入依赖
- 创建nav导航xml(NavGraph),配置app:startDestination属性,创建menu
- 在BottomNavigationView,androidx.navigation.fragment.NavHostFragment引入menu和navGraph配置。
- 在activity做相关的配置。
在Navigation中的disign标签中可以用鼠标连接两个页面。会生成
<action
android:id="@+id/action_blankFragment_to_blankFragment2"
app:destination="@id/blankFragment2" />
action 至少有自己的id和目的地的id。
配置Activity标签,隐式启动时需要和intentFilter配置一样的标签。
导航的模块可以嵌套,并返回。
可以设置全局的action,来跳转。
使用include来引入视图。
<include app:graph="@navigation/included_graph" />
返回
Android会维护一个返回栈,每次调用 navigate() 方法都会将另一目的地放置到堆栈的顶部。点按向上或返回会分别调用 NavController.navigateUp() 和 NavController.popBackStack() 方法,用于移除(或弹出)堆栈顶部的目的地
如果该方法返回 false,则 NavController.getCurrentDestination() 会返回 null。您应负责导航到新目的地,或通过对 Activity 调用 finish() 来处理弹出情况。
栈内复用。
<action android:id="@+id/action_c_to_a" app:destination="@id/a" app:popUpTo="@+id/a" app:popUpToInclusive="true"/>
app:popUpTo="@+id/a" 会清除目标任务上面的fragment,
app:popUpToInclusive="true"
//避免导航之后包含两个目的页面。
传递参数
定义目的地参数 配置对应的标签。
<fragment android:id="@+id/myFragment" >
<argument
android:name="myArg"
app:argType="integer"
android:defaultValue="0" />
</fragment>
可以使用 Safe Args 传递参数。
可以使用bundle传递参数。
NavigationUI
可以用顶部应用栏、抽屉式导航栏和底部导航栏来管理导航。
ViewPager2 +TabLayout
navGraphViewModels() 共性数据。
NavHostFragment.create() 创建NavHostFragment.