Safe Args:使用 parcelables 列表

Safe Args: use list of parcelables

我正在为我的 Android 项目使用带有新导航组件的 Safe Args 插件。现在我有一个参数,它是 parcelables 的数组列表,有没有办法将它与 Safe Args 插件一起使用?

类似于 app:argType=ParcelableArray。这应该是可能的,因为有像 putParcelableArrayList().

这样的捆绑方法

目前我不认为有一个简单的方法来使用带有安全参数的parcelables列表, 但我发现了一些“黑客”来完成这项工作。 例如,我有对象 'User' 并且它是可打包的,我正在声明一个扩展 ArrayList().

的新可打包对象 'Users'
@Parcelize
data class User(var name: String, val age: Int): Parcelable

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

现在我可以将 'Users' 设置为导航中的参数

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

并在目的地之间传递 parcelables 数组列表:

 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


更新二: 如果 activity 被重新创建,上述方法将不起作用,因为 @Parcelize 将无法 store/restore 列表。

对象将存储在状态包中,但是,它将存储一个空的对象列表。

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

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

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

对@LaVepe 建议的改进:对于 Android Studio 3.4.2,您可以通过为所选目的地指定参数来传递具有导航编辑器 in-built 功能的 Parcelable 数组。选择您的自定义 Parcelable class 后,只需检查 'Array' 选项,该选项不应预先包装在任何集合中:

编辑 这是 xml:

中的样子
<argument
        android:name="items"
        app:argType="com.company.domain.Item[]" />

在您的 Fragment/Activity 代码中,您可以严格传递模型 Parcelable 项目的类型化数组。如果你有 non-array 收集并用 Kotlin 编写,它可以通过(如果你事先有列表) list.toTypedArray().

来实现