一分钟--导航的使用

688 阅读2分钟

导航的使用

导航组件基本使用

  • 添加依赖
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.