最全面的Navigation的使用指南

  • Post author:
  • Post category:其他


Navigation可以目前看做Google对于之前的Fragment的不满, 重新搭建的一套Fragment管理框架. 但是Navgation未来应该不仅限于Fragment导航.

并且Navigation可以和BottomNavigationView/NavigationView/Toolbar等结合使用, 不再需要去写冗余代码管理Fragment.

并且具备完善的Fragment回退栈管理.

如果是使用Java语言我不推荐使用任何新框架了, 就自己玩自己的吧.

ktx (除基本依赖外还包含一些Kotlin新特性的函数)

implementation 'androidx.navigation:navigation-fragment-ktx:2.0.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.0.0'
复制代码


一些常用的关键字解释

navigation(nv): 导航, 即Navigation框架的fragment返回栈

graph: 指一个描述返回栈关系的xml文件 (NavigationResourceFile) 也是布局编辑器用于显示图表的界面数据来源

destination: 目标, 即在返回栈中要跳转的新页面

pop: 弹出栈, 会弹出所有不符合目标的页面, 直至找到

目标页面

(默认情况不弹出目标页面也可以设置), 可以理解为Fragment的singleTask模式

navHost: 即所有页面的容器. 类似网页中的host, 所有path路径都是在host之后跟随, host固定不变.

XML编辑

点击NavResourceFile中的Design即可查看布局编辑器, 布局编辑器分为三栏.

左侧是已添加的导航, 中间是页面浏览, 中间栏的工具栏可以创建和快速添加标签以及整理页面, 右侧属性栏方便添加属性.


navigation

这是个嵌套的图表, 可以点击打开新的图表页面.

Activity布局中

<LinearLayout
    .../>
    <androidx.appcompat.widget.Toolbar
        .../>
    <fragment
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        app:navGraph="@navigation/mobile_navigation"
        app:defaultNavHost="true"
        />
    <com.google.android.material.bottomnavigation.BottomNavigationView
        .../>
</LinearLayout>
复制代码
android:name="androidx.navigation.fragment.NavHostFragment"  
固定写法

app:navGraph 
指定navigation资源文件, 也可以不指定后面通过代码中动态设置

app:defaultNavHost 
是否拦截返回键事件, false表示不需要回退栈.
复制代码

NavigationResourceFile

res目录创建 AndroidResourceFile 选择 Navigation. 然后 new-> NavigationResourceFile

navigation

app:startDestination="@+id/home_dest" 指定初始目标
复制代码

navigation可以嵌套navigation标签.

在布局编辑器中会显示为

嵌套navigation无法互相关联

<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_global"
    app:startDestination="@id/mainFragment">

 <!--   <action
        android:id="@+id/global_action"
        app:destination="@id/navigation" />-->

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.example.frameexample.MainFragment"
        android:label="fragment_main"
        tools:layout="@layout/fragment_main">
        <action
            android:id="@+id/action_mainFragment_to_personInfoFragment"
            app:destination="@id/settingFragment" />
    </fragment>

    <navigation
        android:id="@+id/navigation"
        app:startDestination="@id/settingFragment">
        <fragment
            android:id="@+id/settingFragment"
            android:name="com.example.frameexample.SettingFragment"
            android:label="fragment_setting"
            tools:layout="@layout/fragment_setting" />