Bundle类
Bundle类是键值对储存,又被称为字典/关联数组/map。它使用唯一字符串来获取与该键关联值的数据结构。
若想将数据从片段A传递到片段B,通常的做法是:片段A创建一个Bundle类实例将信息保存为键值对。然后传递这个Bundle类实例给片段B。然后片段B获得信息。
此过程中可能引起的错误:
- 类型不匹配错误。若片段A发送的信息是字符串,但是片段B请求的是一个整数,那么该请求将默认返回为0。这将导致编译通过,但是运行程序会产生异常或错误。
- 缺少请求键的错误。若片段B请求的键在Bundle中是不存在的,那么将默认返回
null
。这将导致编译通过,但是运行程序会产生异常或错误。
如果希望AS在编译程序就捕获这些错误,则需要下面所说的插件。
Safe Args Gradle插件
将参数从一个片段传递到另一个片段,为防止错误,使它们称为类型安全的,您可以使用一个名为Safe Args 的Gradle插件。该插件生成NavDirection
类。然后将这些类添加到代码中。以帮助在编译时检测错误。
同时也带来了新的导航方法:使用NavDirection导航。
添加该插件的步骤如下:
1. 添加项目级依赖库。
(可能需要更新Gradle版本,低版本不支持),在项目级build.gradle
文件中添加
dependencies {
......
def nav_version = "2.3.0-alpha01"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}
2. 添加app/moudle级插件。
在app/moudle级build.gradle
文件中添加
apply plugin: 'androidx.navigation.safeargs'
3. 重新生成项目。
safe-Args 插件会为每个片段生成一个类(这个类可以返回NavDirection
对象),每一个类都包含了它的导航到其他片段的操作信息。例如:GameFragment
现在生成了一个GameFragmentDirection
类。
4. 使用NavDirection对象在片段之间导航
view.findNavController().navigate(GameFragmentDirections.actionGameFragmentToGameWonFragment())
// actionGame..Fragment() 方法返回一个NavDirection对象
使用 NavDirection导航并传递参数
通过safe-args插件,我们生成了可以返回NvaDirection类的片段Direction类
。下面将介绍如何使用NavDirection对象来传递信息。
1. 将参数添加到片段
- 打开
navigation.xml
文件(即导航图资源文件,位于res>navigation),单击设计选项卡。 - 选择要添加参数的片段。
- 在属性窗格中,展开参数部分
- 点击加号按钮即可添加该片段具有的参数。添加后,其他片段跳转到该片段须提供对应的参数信息,否则会失败。
- 重新构建应用,以更新片段Direction类和片段参数类
2. 传递参数
格式如下:
// 下面的方法适合没有在片段参数中添加默认值,此时会自动生成这种需要直接传入参数的方法
view.findNavController().navigate(GameFragmentDirections.actionGameFragmentToGameWonFragment(numQuestions, questionIndex))
// 下面的方法适合在片段参数中有了默认值,此时自动生成的片段Direction类的action方法没有传入参数,需要另外设置。
val action = GameFragmentDirections.actionGameFragmentToGameWonfragment()
action.numQuestions = numQuestions
action.questionIndex = questionIndex
view.findNavController().navigate(action)