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)
最后修改:2020 年 06 月 02 日
如果觉得我的文章对你有用,请随意赞赏