概述
AndroidJetpack架构组件套件之一
简化了Android应用程序中导航的实现
官网地址 https://developer.android.google.cn/topic/libraries/architecture/navigation/
- 这里只是简单的学习一下,实际项目中并未用到,用到再去官网详细学吧
组成
导航组件由以下三个关键部分组成:
- 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为目标)以及用户可以通过应用获取的可能路径。
NavHost
:显示导航图中目标的空白容器。导航组件包含一个默认NavHost
实现 (NavHostFragment
),可显示 Fragment 目标。NavController
:在NavHost
中管理应用导航的对象。当用户在整个应用中移动时,NavController
会安排NavHost
中目标内容的交换。
使用
1.要求
目前仅在Android Studio 3.2(目前是preview)版本以上才支持
2.添加项目依赖
1 | // navigation |
3.创建Navigation
res
文件夹,选中点击右键选择New > Android resource file
. 如下图:
- 在弹出的对话框中,
File name
一栏,填写例如”nav_main”,Resource type
一栏选择Navigation
,然后点击OK
,如下图:
- 创建好之后,会发现在
res
文件夹目录下面,会自动生成一个navigation
文件夹,然后刚才我们创建的xml
文件nav_main
也放在里面,如下图:
- 打开
nav_main.xml
,选中design
模式
- 进入
design
模式后,点击下面这个New Destination
按钮
- 选择
Create blank destination
命名Fragment名称为FragmentA,如下图
那个 include fragment factory methods? 选中的话会帮你自动重写一些fragment的方法,像onCreate(),onCreateView()和构造方法等,看起来会有点乱,自己实现也行
- 同上,再创建一个
FragmentB
- 在
design
模式下,创建导航链接,鼠标点击FragmentA
右边中间圆圈不放拖动到FragmentB
上释放鼠标即可,如下图:
- 点击切换到
Text
模式,对应nav_main.xml
对应生成的代码如下:
1 |
|
说明:
里面有两个
fragment
标签,就是我们刚才创建的页面A和B。其中
fragmentA
中的action
是一个节点,destination
就是要导航到fragmentB
。这个就是我们刚才上一步创建导航连接自动实现的代码。
MainActivity
里面对应不需要任何操作,设置好布局即可
1 | public class MainActivity extends AppCompatActivity { |
- 接下来,在
activity_main
里面创建一个fragment
1 |
|
来说明一下后面三个属性
name属性,指定在布局中要实例化
NavHostFragment
navGraph属性,是将
NavHostFragment
与我们刚才创建的navigation
进行关联defaultNavHost属性,
app:defaultNavHost="true"
,意思是NavHostFragment
来拦截系统返回按钮
下面来实现页面跳转和数据传递
fragment_a.xml
如下设置
1 |
|
fragment_b.xml
如下设置:
1 |
|
- 在
FragmentA
中添加Button
点击跳转事件,跳到FragmentB
1 | public class FragmentA extends Fragment { |
说明
- 这里的 id = action_fragmentA_to_fragmentB,就是上面设置的导航action的id
传递参数
- 方式1:通过Bundle方式
1 | // 传递参数 |
b页面接收:
1 | //通过 getArguments 来获取传递的参数 |
- 方式2:使用Safe Args 传递安全的数据
这玩意比较麻烦感觉,用到时候去官网再学吧
https://developer.android.google.cn/guide/navigation/navigation-pass-data#Safe-args
- 运行一下,看一下效果。