本文来自博客园,作者:{观心静},转载请注明原文链接: {https://www.cnblogs.com/guanxinjing/}

本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。

前言

  Google 在2018年推出了 Android Jetpack,在Jetpack里有一种管理fragment的新架构模式,那就是navigation. 字面意思是导航,但是除了做APP引导页面以外.也可以使用在App主页分tab的情况.. 甚至可以一个功能模块就一个activity大部分页面UI都使用fragment来实现,而navigation就成了管理fragment至关重要的架构.

  但是,它不单单只能管理fragment也可以管理activity.这点你格外注意.

使用条件

 你的Android studio 必需升级到3.2版本以上,此博客正在写的时候Android studio已经到达3.5,所以升级到最新版本即可.

依赖

    //navigationimplementation 'android.arch.navigation:navigation-fragment:1.0.0'implementation 'android.arch.navigation:navigation-ui:1.0.0'

使用流程

创建navigation目录

1.选中项目资源文件夹 res 右击 >> New >> New Resource Directory

2.选中navigation 点击创建 (注意这个目录只有在Android studio3.2版本以上才能出现)

创建navigation目录下的xml文件

1.选中项目资源文件夹 res 右击 >> New >> New Resource File

2.选择navigation ,输入xml文件名称,点击ok创建

配置创建的xml文件

上面我们创建了一个叫demo_nav.xml的navigation文件,现在我们需要来设配它来管理fragment

1.打开这个文件选择 Design 模式使用视图手动配置.

2.切换到Design模式后,我们可以看到下面这个界面(恩,一片空白). 我们可以在左上角点击添加图标,进入添加内容的操作.

3.点击后添加图标后,可以看到下面这个弹窗,这里解释一下:

第一个 Create new destinattion,字面意思创建一个新目标(其实就是创建fragment,当然你也可以手动另外创建fragment不一定需要在这里创建)

第二个 placeholder,这个就是重点了. 这是一个管理fragment跳转的节点,我们点击后可以创建它.为了了解它的使用方式,点击3次创建三个节点

4.节点创建后可以看到三个节点(看下面图片,这些节点都是我已经导入fragment了.不要急后面会讲解如何导入).这里有一个重点! 你可以点击这些页面(会有一个蓝点),点击蓝点按住向右分配它需要跳转的另外一个页面.(它会自动生成一些我们跳转的代码)

6.然后点击左下角的Text模式,在Text模式下,可以看到如下代码,在上面的图片中你可以很清楚的看到创建了3个节点,并且是一个跳转一个的.从第一个fragment跳转到第二个fragment,再从第二个fragment跳转到第三个fragment。

下面我们来重点讲解下下面的这些代码的关键点了:

在<navigation里的属性:

1.android:id="@+id/demo_nav" 这个属性是你这个xml文件navigation的id,很重要,我们需要在activity的xml布局里引用,记得写上不要忘记

2.app:startDestination="@id/one" 这个属性是你首次加载的第一个页面,很重要,一般就是第一个fragment

在<fragment 里的属性:

其实就是一个节点你也可以理解成一个fragment

1.android:id="@+id/one"  每一个fragment节点都需要有自己的id,很重要. 我们需要在后面的节点上使用这些id指定跳转目标

2.android:name="demo.yt.com.demo.fragment.BlankFragment"   这个属性是你这个节点所对应的fragment(需要你导入指定的fragment文件路径),这个很重要

3.android:label="BlankFragment" 一个标签名称,用于记录这个节点的标签信息(大概可能是在代码里的Intent里获取来知晓此次是那个fragment节点在跳转,没深究了)

4.tools:layout="@layout/fragment_blank" 这个属性不是重要的,设置它后你可以在切换到Design模式后看到,视图页面的fragment的预览图(就在上面的图片里,可以直接看到fragment效果)

在<action 里的属性:

action 负责编写跳转动作

1. android:id="@+id/action_one_to_two" 这个很重要,它是这个跳转动作的id, 这个id我们将在后面的代码中调用,用于执行fragment的跳转

2. app:destination="@id/two" 跳转的目标fragment,这个很重要

<?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/demo_nav"app:startDestination="@id/one"><fragment android:id="@+id/one"android:name="demo.yt.com.demo.fragment.BlankFragment"android:label="BlankFragment"tools:layout="@layout/fragment_blank"><actionandroid:id="@+id/action_one_to_two"app:destination="@id/two" /></fragment><fragment android:id="@+id/two"android:name="demo.yt.com.demo.fragment.Blank2Fragment"android:label="BlankFragment"tools:layout="@layout/fragment_blank2"><actionandroid:id="@+id/action_two_to_three"app:destination="@id/three" /></fragment><fragment android:id="@+id/three"android:name="demo.yt.com.demo.fragment.Blank3Fragment"android:label="BlankFragment"tools:layout="@layout/fragment_blank3"/></navigation>

让navigation与Activity关联起来

现在我们已经创建了navigation,但是使用它还需要一个根Activity,它毕竟还是需要依托Activity的.

1.创建了一个叫DemoActivity的Activity.这个没啥,下面来看这个Activity的布局xml怎么配(如下xml代码)

  我们就关注DemoActivity中fragment组件的一些属性

1.android:name="androidx.navigation.fragment.NavHostFragment"  这个非常重要,这是你告知fragment需要使用navigation模式的关键属性,另外它是固定死的.你必需写.

2. app:defaultNavHost="true"  这是你实现物理按键(比如返回键),是按一下退出一个fragment 还是直接退出这个Activity的关键属性

3.app:navGraph="@navigation/demo_nav"  很重要,这就是我们前面创建的navigation的xml文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".fragment.DemoActivity"><fragmentandroid:id="@+id/demo_fragment"android:layout_width="0dp"android:layout_height="0dp"android:name="androidx.navigation.fragment.NavHostFragment"app:defaultNavHost="true"app:navGraph="@navigation/demo_nav"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>

实现fragment跳转与返回

进入到DemoActivity后,首先会自动加载到第一个fragment. 然后我们看看如何跳转到其他fragment中

1.从第一个碎片跳转到第二个碎片,关键代码  Navigation.findNavController(getView()).navigate(R.id.action_one_to_two);

public class BlankFragment extends Fragment {private Button mBtnInputFragment2;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {final View view = inflater.inflate(R.layout.fragment_blank, container, false);;mBtnInputFragment2 = view.findViewById(R.id.btn_input_fragment2);mBtnInputFragment2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Navigation.findNavController(getView()).navigate(R.id.action_one_to_two);//这个id就是navigation里的action的id}});return view;}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic void onDetach() {super.onDetach();}}

2.从第二个碎片返回到第一个碎片,关键代码 Navigation.findNavController(getView()).popBackStack();

public class Blank2Fragment extends Fragment {private Button mBtnInputFragment3, mBtnBack;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_blank2, container, false);mBtnInputFragment3 = view.findViewById(R.id.btn_input_fragment3);mBtnBack = view.findViewById(R.id.back);mBtnInputFragment3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Navigation.findNavController(getView()).navigate(R.id.action_two_to_three); //进入第三个碎片}});mBtnBack.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Navigation.findNavController(getView()).popBackStack(); //返回上一个碎片}});return view;}}

Android | navigation入门详解相关推荐

  1. Android studio入门详解

    1.如何查看Android studio的环境搭建是否成功 首先在Android studio中的sdk manager查看sdk存放位置,如何打开,同时按shirt+ctrl+鼠标右键,如下图: 然 ...

  2. Android Studio 插件开发详解一:入门练手

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  3. Jetpack Compose入门详解(实时更新)

    Jetpack Compose入门详解 前排提醒 前言(Compose是什么) 1.实战准备 一.优势与缺点 二.前四课 三.标准布局组件 1.Column 2.Row 3.Box 四.xml和com ...

  4. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  5. android屏幕适配详解

    android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要 ...

  6. Android Studio 插件开发详解四:填坑

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78265540 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  7. Android Studio 插件开发详解三:翻译插件实战

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. xposed模块编写教程_Xposed插件开发入门详解,

    Xposed插件开发入门详解, 前言 Xposed的用处不必言说,能hook任意java写的代码,修改替换apk内部的资源文件. 至于如何开发一个XPosed的插件,官方给出的答案如下: https: ...

  9. FFmpeg入门详解之121:颜色空间转换RGB和YUV的原理与实战

    5.颜色空间转换RGB和YUV的原理与实战 三种颜色空间模型:RGB.YUV.HSV 一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间. 但被描述 ...

最新文章

  1. 虚拟机复制后修改eth1为eth0
  2. Redis常用五大数据类型
  3. 计算机投诉信英语作文,【回复投诉信英语作文】_英语投诉信回复范文
  4. TypeScript基础入门 - 函数 - 简介
  5. IMEI, ESN, MEID
  6. mysql存储过程 php_PHP调用MYSQL存储过程实例
  7. UVA - 10061 How many zero#39;s and how many digits ?
  8. linux6.8安装图形桌面,图形/文本界面安装CentOS 6.8系统详解
  9. rsync+inotify实现实时同步案例详解
  10. B - Dungeon Master
  11. [vscode] convert tabs to spaces
  12. linux下怎么解压tar.xz,Linux下解压.tar.xz格式文件的方法
  13. [摘文]BizTalk概述
  14. Symbian 之浏览器
  15. 超定方程组及其求解方法
  16. 三极管串联线性稳压电路原理详解及Multisim仿真
  17. 自动设置为兼容模式html5,详细教你将IE浏览器设置为兼容模式的设置方法
  18. Linux下Navicat premium 12 免费亲测可用
  19. 2010齐鲁软件大赛题目(十一)虚拟化环境下的多媒体教室设计
  20. 基于百度飞浆平台(EasyDL)设计的人脸识别考勤系统

热门文章

  1. python编程软件免费吗_Python Mac下载-Python for Mac(Python编程工具) v3.10.0a2免费版
  2. IBM实习日记——6.16-6.18
  3. ORA-01139:
  4. iOS-关于M1芯片可以下载APP使用问题
  5. mul matlab,[转载]Matlab boxplot for Mul
  6. 少壮不努力,长大写代码。。
  7. r语言拟合MA模型,及时序图,自相关图,偏自相关图
  8. A nice speech——王强 at 36 Kr
  9. 精通Web Analytics 2.0 (13) 第十一章:变身分析忍者的指导原则
  10. 【调剂】关于安徽工程大学2022年硕士研究生招生相关问题答考生问