Loading... ## 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`文件中添加 ```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`文件中添加 ```build.gradle apply plugin: 'androidx.navigation.safeargs' ``` #### 3. 重新生成项目。 safe-Args 插件会为每个片段生成一个类(这个类可以返回`NavDirection`对象),每一个类都包含了它的导航到其他片段的操作信息。例如:`GameFragment`现在生成了一个`GameFragmentDirection`类。 #### 4. 使用NavDirection对象在片段之间导航 ```kotlin view.findNavController().navigate(GameFragmentDirections.actionGameFragmentToGameWonFragment()) // actionGame..Fragment() 方法返回一个NavDirection对象 ``` ---------- ## 使用 NavDirection导航并传递参数 通过safe-args插件,我们生成了可以返回NvaDirection类的`片段Direction类`。下面将介绍如何使用NavDirection对象来传递信息。 #### 1. 将参数添加到片段 * 打开`navigation.xml`文件(即导航图资源文件,位于res>navigation),单击设计选项卡。 * 选择要添加参数的片段。 * 在属性窗格中,展开参数部分 * 点击加号按钮即可添加该片段具有的参数。添加后,其他片段跳转到该片段须提供对应的参数信息,否则会失败。 * 重新构建应用,以更新片段Direction类和片段参数类 #### 2. 传递参数 格式如下: ```kotlin // 下面的方法适合没有在片段参数中添加默认值,此时会自动生成这种需要直接传入参数的方法 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 日 11 : 18 AM © 允许规范转载