Android Jetpack -- Navigation篇

Android Jetpack -- Navigation篇,第1张

概述Navigation是指允许用户在应用程序中浏览、进入和退出不同内容的Fragment。Navigation能够实现从简单的按钮单击到更复杂的模式,如应用程序栏和导航抽屉。导航组件还通过遵循一套既定的原则来确保一致和可预测的用户体验。来看下Navigation的原则吧:固定的起始位置:也就是

Navigation是指允许用户在应用程序中浏览、进入和退出不同内容的Fragment。Navigation能够实现从简单的按钮单击到更复杂的模式,如应用程序栏和导航抽屉。导航组件还通过遵循一套既定的原则来确保一致和可预测的用户体验。
来看下Navigation的原则吧:

固定的起始位置:也就是说除去登陆等一次性界面,用户在启动App最先看到的界面需要为一个固定的起始界面。Navigation的表现形式为堆栈形式:就是Navigation应该类似为栈一样,栈顶为用户所看到的界面,界面的切换总是在栈顶进行,导航到目标后,目标位于栈顶。标题栏的回退应该和返回键的功能一样,但是标题栏不能退出应用:这个也很容易理解,因为两个的定义就存在本质的区别。Deep link:也就是从其他页面,比如浏览器,跳转到App时,用户首先看到的应该还是浏览器的那个页面,没有其他界面的跳转过程。

这些原则,无疑都是为了带给用户良好的体验,也是我们应该遵守的。
Navigation:有三个主要的部分:

Navigation graph:也就是Navigatation的xml文件,包含所有的需要跳转的目标NavHost:一个容器,用于显示NavController:控制跳转流程

Google官方也指出了使用Navigation具有以下优点:

方便的处理Fragment事务正确的处理标题栏的回退与实体返回键实现过渡动画的统一管理实现并处理Deep link用最少的工作完成导航栏的UI设计Safe Args:在Fragment切换是提供类型安全的数据支持viewmodel具体实现

新建两个Fragment,HomeFragment和DetailFragment。
在Activity中为Fragment添加NavHost容器。
NavActivity.java

<fragment        androID:ID="@+ID/fragment"        androID:name="androIDx.navigation.fragment.NavHostFragment"        androID:layout_wIDth="match_parent"        androID:layout_height="match_parent"        app:defaultNavHost="true"        app:navGraph="@navigation/nav" />

再新建navigation文件夹新建Navigation graph。添加Fragment到其中


建立Fragment之间的跳转关系,当然也可以直接在xml文件里写,不过这样会有点麻烦。
nav.xml

<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"    app:startDestination="@ID/homeFragment">    <fragment        androID:ID="@+ID/homeFragment"        androID:name="com.hao.jetpackdemo.navigation.HomeFragment"        androID:label="home"        tools:layout="@layout/home_fragment">        <action            androID:ID="@+ID/action_homeFragment_to_detailFragment2"            app:destination="@ID/detailFragment"            app:enteranim="@anim/nav_default_pop_enter_anim"            app:exitAnim="@anim/nav_default_pop_exit_anim" />    </fragment>    <fragment        androID:ID="@+ID/detailFragment"        androID:name="com.hao.jetpackdemo.navigation.DetailFragment"        androID:label="detail"        tools:layout="@layout/fragment_detail">        <action            androID:ID="@+ID/action_detailFragment_to_homeFragment"            app:destination="@ID/homeFragment"            app:enteranim="@anim/nav_default_pop_enter_anim"            app:exitAnim="@anim/nav_default_pop_exit_anim" />    </fragment></navigation>

现在便可以来具体实现跳转了。
HomeFragment.java

public class HomeFragment extends Fragment {    @OverrIDe    public VIEw onCreateVIEw(@NonNull LayoutInflater inflater, @Nullable VIEwGroup container,                             @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.home_fragment, container, false);    }    @OverrIDe    public voID onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        Objects.requireNonNull(getVIEw()).findVIEwByID(R.ID.button)                .setonClickListener(Navigation.createNavigateOnClickListener(R.ID.action_homeFragment_to_detailFragment2));    }}

其实createNavigateOnClickListener()也就是对onClickListener进行了封装,,,怎么说嘞,Jetpack里面对很多对象都进行了进一步的封装,虽然简化了开发的代码量,但是想要弄清原理就更要麻烦点了。
好了,Navigation的初步使用也就到这了

Fragement间数据传递

这里也没有很大的变化,也是通过Bundle来传递的,然后接收方通过getArguments()来获取到对应的Bundle从而取出数据

Fragment转换动画

也是可以直接在Navigation graph中直接设置转换动画,说真的极大减少了工作量。

配合viewmodel、Databinding、liveData使用

借用https://www.bilibili.com/video/av61814701中的图片


其实和前面的 *** 作也都差不多,只不过两个Fragment共享一个viewmodel。

总结

以上是内存溢出为你收集整理的Android Jetpack -- Navigation篇全部内容,希望文章能够帮你解决Android Jetpack -- Navigation篇所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1104348.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存