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" />