概述
当前Android开发中使用Fragment来开发页面已经成为主流做法。Fragment轻量、可控性强等优点让人感觉很香。但是Fragment也有自己的硬伤,那就是回退栈与页面参数传递。
核心功能
- 处理 Fragment 事务
- 默认情况下,正确处理往返操作。
- 为动画和转换提供标准化资源。
- 实现和处理深层链接
- 包括导航界面模式(例如抽屉式导航栏和底部导航),用户只需完成极少的额外工作
- Safe Ags-可在目标之间导航和传递数据时提供类型安全的Gradle插件
- VewModel支持·您可以将VewModel的范围限定为导航图,以在图表的目标之间共享与界面相关的数据。
核心三件套
导航图
在一个集中位置包含所有导航相关信息的XML资源。这包括应用内所有单个内容区域(称为目标)以及用户可以通过应用获取的可能路径。
NavHost
显示导航图中目标的空白容器。导航组件包含一个默认NavHost实现(NavHostFragment),可显示Fragment 目标
NavController
在NavHost 中管理应用导航的对象。当用户在整个应用中移动时,NavController会安排NavHost 中目标内容的交换
在应用中导航时,您告诉NavController,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController便会在NavHost中显示相应目标。
Navigation的基础使用
环境配置
依赖
def nav_version = "2.4.0"
// Java language implementation
implementation "androidx.navigation:navgation-fragment$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
创建Fragment
这里说明一下,要知道,核心三大件中的导航图其实本质上指的是Fragment,我们可以把Fragment认为是一个目标。
构建navigation核心(导航图)配置
-
navigation(主标签)
startDestination启动默认的目标Fragment -
fragment(代表一个destination资源,其实就是一个目的地)
- id:资源编号
- name:资源类型
- layout:fragment对应需要加载的布局资源。
- label:标签文本
-
action(一个固定的跳转路径)
- id:资源编号
- destination:目的地
- enterAnim:跳转动画
- exitAnim:退出动画
在Activity中声明NavHost容器
我们实际上是由一个NavHostFragment作为核心展示容器,然后将导航图数据绑定到上面这里申明一个主要展示容器NavHostFragment,他本质上也是一个Frament然后需要通过app:navGraph="@navigation/nav_graph"绑定一个导航图app:defaultNavHost="true"表示回退栈由fragment管理
<fragment
android:id="@+id/fmt_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="androidx.navgation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"/>
将NavHost容器交给NavController进行控制
NavController navController = Navigation.findNavController(this, R.id.fmt_main);
参数传递
fragment之间的数据传递
- 数据传递通过Bundle完成
- fragment之间的跳转由Navigation控制,通过调用配置好的Action路径进行跳转
- 数据接受通过getArguments()
String name = getArguments().getString(“name”);