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()
.
来实现
我正在为我的 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()
.