Androidx中的fragment是v4包中fragment的升级版本,在之前开发中所有用到的v4-fragment相关方法在androidx-fragment都是类似使用的,无非就是v4-Fragment-FragmentActivity变成了androidx-fragment-FragmentActivity,当使用的fragment需要Lifecycle时,那就只能使用androidx-fragment了。
navigation是什么?
Navigation 是一个可简化Android导航的库和插件。
传统的Fragment管理需要在activity里中严格控制切换,包括控制导航返回/切换动画,全靠FragmentTransaction一手严格操办。
Google觉得不够cool,所以有了navigation。
navigation的主要组成

  1. 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。包括所有的fragment及相关fragment切换的路径。(类似于地图功能)
  2. NavHost:显示导航图中目标的空白容器。导航组件包含一个默认 NavHost 实现 (NavHostFragment),可显示 Fragment 目标。(功能类似于汽车)
  3. NavController:在 NavHost 中管理应用导航的对象。当用户在整个应用中移动时,NavController 会安排 NavHost 中目标内容的交换。(功能类似于方向盘,想显示地图上的位置就切换过去,没有路径则过不去)
navigation简单使用
0,加入依赖

    implementation "androidx.navigation:navigation-fragment:2.3.2"implementation "androidx.navigation:navigation-ui:2.3.2"

1,建立导航图

在res下新建导航图文件夹navigation,右键新建->Navigation Resource File

2,新建3个Fragment,WelcomeFragment LoginFragment RegisterFragment

自动生成代码

package com.sun.navigation;import android.os.Bundle;import androidx.fragment.app.Fragment;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;/*** A simple {@link Fragment} subclass.* Use the {@link LoginFragment#newInstance} factory method to* create an instance of this fragment.*/
public class LoginFragment extends Fragment {// TODO: Rename parameter arguments, choose names that match// the fragment initialization parameters, e.g. ARG_ITEM_NUMBERprivate static final String ARG_PARAM1 = "param1";private static final String ARG_PARAM2 = "param2";// TODO: Rename and change types of parametersprivate String mParam1;private String mParam2;public LoginFragment() {// Required empty public constructor}/*** Use this factory method to create a new instance of* this fragment using the provided parameters.** @param param1 Parameter 1.* @param param2 Parameter 2.* @return A new instance of fragment LoginFragment.*/// TODO: Rename and change types and number of parameterspublic static LoginFragment newInstance(String param1, String param2) {LoginFragment fragment = new LoginFragment();Bundle args = new Bundle();args.putString(ARG_PARAM1, param1);args.putString(ARG_PARAM2, param2);fragment.setArguments(args);return fragment;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {mParam1 = getArguments().getString(ARG_PARAM1);mParam2 = getArguments().getString(ARG_PARAM2);}}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_login, container, false);}
}

很nice,自动生成布局,传参相关代码也写好了。

3,当前设计方向为欢迎能进入登录及注册,登录能进去注册,通过在login_navigation.xml进行拖拽完成,得到如下识图(地图)

对应的代码如下

<?xml version="1.0" encoding="utf-8"?>
<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/login_navigation"app:startDestination="@id/welcomeFragment"><fragmentandroid:id="@+id/welcomeFragment"android:name="com.sun.navigation.WelcomeFragment"android:label="fragment_welcome"tools:layout="@layout/fragment_welcome" ><actionandroid:id="@+id/action_welcomeFragment_to_loginFragment"app:destination="@id/loginFragment" /><actionandroid:id="@+id/action_welcomeFragment_to_registerFragment"app:destination="@id/registerFragment" /></fragment><fragmentandroid:id="@+id/loginFragment"android:name="com.sun.navigation.LoginFragment"android:label="fragment_login"tools:layout="@layout/fragment_login" ><actionandroid:id="@+id/action_loginFragment_to_registerFragment"app:destination="@id/registerFragment" /></fragment><fragmentandroid:id="@+id/registerFragment"android:name="com.sun.navigation.RegisterFragment"android:label="fragment_register"tools:layout="@layout/fragment_register" />
</navigation>

4,添加Fragment容器NavHostFragment

activity_main.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/my_nav_host_fragment"android:name="androidx.navigation.fragment.NavHostFragment"//这是系统定义的专门用来显示navigation地图中fragment的fragmentandroid:layout_width="match_parent"android:layout_height="match_parent"app:defaultNavHost="true"                                    //true 返回键会回到上一个fragment false返回键由activity响应,一般是退出activityapp:navGraph="@navigation/login_navigation" /></LinearLayout>

这样子显示部分就好了,activity启动后把androidx.navigation.fragment.NavHostFragment作为显示容器,加载navigation中的login_navigation导航图,在导航图上startDestination标识了welcomefragment是首先展示页,同时在welcomeFragment中,定义了2个action(跳转动作,路标?),可以跳转到LoginFragment和RegisterFragment,另外,LoginFragment也有动作能跳转到RegisterFragment上,下面在代码中添加NavControIIer(导航控制器?)完成页面切换。

普通导航
Navigation.findNavController(v).navigate(R.id.action_welcomeFragment_to_loginFragment);带参数导航
Bundle bundle=new Bundle();
bundle.putString("phone",et_phone.getText().toString());
Navigation.findNavController(v).navigate(R.id.action_loginFragment_to_registerFragment,bundle);如何导航到一个地图上本页面无法到达的页面会咋样?
报错参数异常
java.lang.IllegalArgumentException: Navigation action/destination com.sun.navigation:id/action_welcomeFragment_to_registerFragment cannot be found from the current destination Destination

5,为了解决跳转的生硬,需要添加动画,在原始代码上,可以通过fragment事务的setCustomAnimations()进行处理,而navigation,直接在导航图上进行添加,这样就能把偏view的动画添加代码移动xml上

双击action,给fragment的切换添加动画

<fragmentandroid:id="@+id/welcomeFragment"android:name="com.sun.navigation.WelcomeFragment"android:label="fragment_welcome"tools:layout="@layout/fragment_welcome"><actionandroid:id="@+id/action_welcomeFragment_to_loginFragment"app:destination="@id/loginFragment"app:enterAnim="@anim/window_right_in"app:exitAnim="@anim/window_left_out"app:popEnterAnim="@anim/window_left_in"app:popExitAnim="@anim/window_right_out" /><actionandroid:id="@+id/action_welcomeFragment_to_registerFragment"app:destination="@id/registerFragment"app:enterAnim="@anim/window_right_in"app:exitAnim="@anim/window_left_out"app:popEnterAnim="@anim/window_left_in"app:popExitAnim="@anim/window_right_out" /></fragment>

在导航图上自动出现了enterAnim和exitAnim的属性,这样就完成了动画的添加。

至此,navigation的基本操作已经完成,还有使用场景较少的深层链接,SafeArgs(个人不推荐)后续有时间再分析。

Android-Jetpack代码位置:github

Jetpack学习-5-Navigation简单使用相关推荐

  1. Android Jetpack 学习之Navigation、BottomNavigationView

    先上效果图: Navigation组件,也可以理解成FragmentNavigation.它提供了多Fragment之间的转场.栈管理,帮助我们可以更轻松的使用Fragment.在抽屉式导航栏.底部导 ...

  2. Sunflower——Google官方的Jetpack学习项目笔记(Java版)

    由于Google官网给出的该项目是Kotlin版本,我将其改造成Java版本,供大家学习参考,文末给出下载链接,里面包含了详细的注释说明. 该项目虽然简单,但是用到的知识很多,正所谓麻雀虽小五脏俱全, ...

  3. Android Jetpack组件之Navigation使用-源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  4. ios navigation的返回按钮长按_Android Jetpack架构组件 — Navigation入坑详解 [转]

    前言 这是最近看见的觉得比较有意思的文,希望对大家的学习有帮助. Navigation 直接翻译即为导航,它是 Android Jetpack 组件之一,让单 Activity 应用成为首选架构.应用 ...

  5. Jetpack学习-Paging

    个人博客 http://www.milovetingting.cn Jetpack学习-Paging Paging是什么 分页库可一次加载和显示一小块数据.按需载入部分数据会减少网络带宽和系统资源的使 ...

  6. WebGL(三)——学习Canvas及简单图形绘制

    WebGL(三)--学习Canvas及简单图形绘制 Canvas简介 canvas是HTML5新增的一个可以使用javascript脚本在其中绘制图像的HTML元素(容器),它可以用来制作图像.动画, ...

  7. python自训练神经网络_tensorflow学习笔记之简单的神经网络训练和测试

    本文实例为大家分享了用简单的神经网络来训练和测试的具体代码,供大家参考,具体内容如下 刚开始学习tf时,我们从简单的地方开始.卷积神经网络(CNN)是由简单的神经网络(NN)发展而来的,因此,我们的第 ...

  8. 学习了下简单的光照模型

    博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 50  文章- 53  评论- 57  学习了下简单的光照模型 龙书和SDK光照的例子也看到几个了,今天看<GPU 编程与CG 语言之阳春白 ...

  9. VC学习笔记:简单绘图

    VC学习笔记:简单绘图 SkySeraph Oct.29th 2009  HQU Email-zgzhaobo@gmail.com  QQ-452728574 Latest Modified Date ...

最新文章

  1. 《数据分析实战 基于EXCEL和SPSS系列工具的实践》一第2章 数据分析的理论、工具、模型...
  2. 人民广场怎么走? 地铁换乘算法的实现 MikeTech | MikeTech
  3. java触发full gc的几种情况概述
  4. 涂抹mysql笔记-mysql复制特性
  5. win32中GBK、UTF8的互转
  6. 存储过程,触发器,分页练习
  7. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入
  8. 使用Okta的单点登录保护您的Vert.x服务器
  9. java写入文件的几种方法分享
  10. S/4HANA生产订单增强WORKORDER_UPDATE方法BEFORE_UPDATE参数分析 1
  11. java单击按钮切换图片_JAVA点击按钮改变背景图片 跪求代码·
  12. Android开发笔记(六十三)HTTP访问的通信方式
  13. sqlmap使用手册
  14. CORBA版HelloWorld
  15. 红外测试操作步骤_红外分光测油仪操作步骤及注意事项
  16. word计算机板书,Word板书设计怎么写
  17. 如何通过里程碑控制项目进度
  18. NTFS Change Journal(USN Journal)详解
  19. bootstrap4导航栏居右
  20. Acwing活动打卡做题数统计爬虫

热门文章

  1. android手机到iphone6s,iPhone6s相当于现在什么档次的安卓手机?结果让国产手机品牌汗颜...
  2. 有限差分法上-椭圆系统
  3. redis 失效时间单位是秒还是毫秒_redis设置过期时间
  4. python抓取谷歌指数(Google Trends)
  5. spring之----事务
  6. undefined和is not defined区别
  7. 7、邮箱验证码的功能设计
  8. 【Audio】Unity音频模块:加载、转换、剪切、混音、合并
  9. Spring 4 - AOP
  10. C盘清理-我的C盘莫名其妙就满了?