今天学习Android的navigation
github地址 https://github.com/Eric-Han0521/NavigationExamplesTest.git
导航是指支持用户导航、进入和退出应用中不同内容片段的交互。Android Jetpack 的导航组件可帮助您实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模式,该组件均可应对。导航组件还通过遵循一套既定的规则来确保一致且可预测的用户体验。
导航组件由以下三个关键部分组成:
导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为目标)以及用户可以通过应用获取的可能路径。
NavHost:显示导航图中目标的空白容器。导航组件包含一个默认 NavHost 实现 (NavHostFragment),可显示 Fragment 目标。
NavController:在 NavHost 中管理应用导航的对象。当用户在整个应用中移动时,NavController 会安排 NavHost 中目标内容的交换。
在应用中导航时,您告诉 NavController,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController 便会在 NavHost 中显示相应目标。
导航组件提供各种其他优势,包括以下内容:
处理 Fragment 事务。
默认情况下,正确处理往返操作。
为动画和转换提供标准化资源。
实现和处理深层链接。
包括导航界面模式(例如抽屉式导航栏和底部导航),用户只需完成极少的额外工作。
Safe Args - 可在目标之间导航和传递数据时提供类型安全的 Gradle 插件。
ViewModel 支持 - 您可以将 ViewModel 的范围限定为导航图,以在图表的目标之间共享与界面相关的数据。
此外,您还可以使用 Android Studio 的 Navigation Editor 来查看和编辑导航图。
Android developer官网复制,手动狗牌
依赖导入链接 https://developer.android.google.cn/guide/navigation/navigation-getting-started
本篇设计主题包括Create destinations,Design navigation graphs,Global actions,Navigate to a destination,Conditional navigation,Pass data between destinations,Animate transitions between destinations
在创建项目之前po出完成的项目结构,以供参考
首先创建一个Android project,并把项目名定义的特别长显的高级
然后接入正题
首先我们需要准备6个fragment备用,并在对应的布局文件中创建各种组件,布局文件代码详见github地址
然后取消选择如下的两个框框,因为我们暂时用不到
定义好6个fragment后我们创建我们的主角navigation graphs
然后在我们的activity_main.xml文件中创建一个fragment,并添加
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"
别忘了设置fragment的id
然后在我们的nav_graph中将事先准备好的6个fragment添加进去
虽然有位伟大的课程老师和我们说过图形界面都是歪门左道,但是就是好用,哈哈哈哈哈
这里注意fragment添加的顺序,首次被添加的会默认成为startDestination,也可以在nav_graph中设置startDestination
然后我们点击框框边的圆点进行拖拖拽拽,确定fragment的显示先后顺序
这时候我们可以看到nav_graph中出现密密麻麻的代码,着重注意action,我们很多属性都需要在这里面设置
接下来我们我们在java文件中对布局文件中的组件进行注册和跳转控制,我们以MainFragment为例,在java文件中注入一下代码
照猫画虎,其他的几个fragment的也按照这种方式去编辑
到这里我们有了一个可以运行的小项目了
接下来我们就可以在destination之间定义动画了
动画的定义其实很简单,我们首先需要定义四个不同状态的动画,分别为slide_in_left,slide_in_right,slide_out_left,slide_out_right,顾名思义分别是左侧滑进,右侧滑进,左侧滑出与右侧滑出。然后我们在nav_graph中的action中引用这些
这样我们destination之间的跳转动画也就做好了
以上图的mianFragment和viewTransactionFragment为例,讲解一下这四种属性的区别
上图我们知道,这是mainFragment 跳转到 viewTransactionFragment,
app:enterAnim
是这个action的destination进入的动画,是viewTransactionFragment的入场动画
app:exitAnim
是这个action所在元素离开的动画,是mainFragment的离场动画
app:popEnterAnim
是action所在元素的入场动画,即按下返回按钮,destination出栈,mainFragment的入场动画
app:popExitAnim
是destination出栈时离开的动画,即viewTransactionFragment的离场动画
接下来我们进行fragment之间的通信
我们需要在fragment中定义argument来声明要通信的关键字
如上图所示,我们声明了一个名为recipient的argument,初始值为None,我们只需要在准备跳转到该destination的fragment的java文件中定义一个bundle,并将bundle放入navController.navigate方法中即可
Bundle bundle = new Bundle();
bundle.putString("recipient",textInputEditText.getText().toString());
navController.navigate(R.id.action_chooseRecipientFragment_to_specifyAmountFragment,bundle);
然后我们在destination对应的java文件中调用getArguments().getString("recipient")就可以获得上一个fragment传过来的值
到这,navigation的入门基本属于告一段落了
这就是这篇文章的全部内容了,希望对大家有所帮助
祝程序员们多敲代码,少入坑,从此远离ICU,拜拜