安全Args:使用包裹清单

时间:2018-11-28 13:45:17

标签: android parcelable android-architecture-navigation

我正在将Safe Args插件与Android项目的新导航组件一起使用。现在,我有一个参数是可包裹物的数组列表,是否可以将其与Safe Args插件一起使用?

类似app:argType=ParcelableArray。这应该是可能的,因为有putParcelableArrayList()之类的捆绑方法。

3 个答案:

答案 0 :(得分:6)

是的,从1.0.0-alpha08版本开始,您现在可以像这样传递可包裹对象的数组:

<argument
  android:name="users"
  app:argType="com.navigation.test.User[]"/>

用于传递基本类型的数组,例如用于app:argType="integer[]"

答案 1 :(得分:3)

目前,我不认为有一种简单的方法可以使用带有安全参数的包裹清单, 但是我发现了一些“技巧”来使这项工作有效。 例如,我有一个对象“ User”,并且它是可拆分的,我声明了一个扩展ArrayList()的新的可拆分对象“ Users”。

@Parcelize
data class User(var name: String, val age: Int): Parcelable

@Parcelize
class Users: ArrayList<User>(), Parcelable

现在我可以在导航中将“用户”设置为参数

<argument
      android:name="users"
      app:argType="com.navigation.test.Users"/>

在目的地之间传递可包裹物的数组列表:

 val user=User("Alex", 36)
 val users= Users()
 users.add(user)
 val action=MainFragmentDirections.actionMainFragmentToSecondFragment(users)
 NavHostFragment.findNavController(this@MainFragment).navigate(action)

并在其他目的地检索它们:

val users=SecondFragmentArgs.fromBundle(arguments).users
val user=users[0]
txtViewName.text=user.name
txtViewAge.text="${user.age}"

更新

支持alpha8中的对象列表: https://issuetracker.google.com/issues/111487504

答案 2 :(得分:0)

对@LaVepe建议的改进:与Android Studio 3.4.2一样,您可以通过为选定的目标指定参数来传递具有导航编辑器内置功能的Parcelable数组。选择您自定义的Parcelable类后,只需检查“数组”选项即可,该类不应事先包装在任何集合中:

Example