不会重新创建通过片段提供给Fragments的Parcelable objetcs

问题描述

...意味着无论如何,您都使用相同的当前指针指向内存中的同一对象。

您注意到了吗?


与调试器一起解决一个不相关的问题,我很惊讶地发现我的可包裹对象在创建片段之前和操作时具有相同的实例编号。在所述片段中。

我在继承@Parcelize的数据类上使用Kotlin Parcelable,并查看其文档,只是说它将为您生成所需的样板代码(创建者,写入包裹等)。 )。

问题易于复制:

  1. 创建一个data class
@Parcelize
data class UserData(
    val id: Int,var name: String
    var age: Int
) : Parcelable
  1. 假设您处于“片段”或“活动”中(实际上并不重要)
  2. 您创建ChangeUserDataFragment,并在用户单击按钮修改其个人资料数据后立即设置其参数:
companion object {
    fun instantiate(userData: UserData) = 
        ChangeUserDataFragment().apply {
            arguments = bundleOf("user_data" to userData)
        }   
}
  1. 您通常会显示ChangeUserDataFragment
  2. 在现在显示ChangeUserDataFragment中,用户更新其nameage并验证所做的更改,从而使他回到显示个人资料数据之前的状态。
  3. 如果在第3步和第4步中在相关的生命周期回调中使用调试器,则会注意到您一直在使用相同的userData 实例(实例编号是一样的)。 从在父Fragment /宿主活动中创建它一直到用户在您的ChangeUserDataFragment中编辑其值的时间。

换句话说,这显然是边缘效应的一种情况,其中在另一个片段上对可包裹objetc进行的修改在创建它的视图(宿主“活动”或父片段)中是显而易见的。

这可以使用本机Fragment(已弃用)和AndroidX Fragment框架重新创建。但是,无法在活动之间(通过其Intent的附加功能)重新创建:对象已重新创建。

---> 这是正常行为吗?它记录在某处吗? 在我的所有岁月中,我一直被认为,在Activity的Intent的Extras和Fragments的论据之间来回发送时,Parcelable一直都是序列化和反序列化的。

那如何保存Fragment的实例状态呢?当您使用“片段”恢复“活动”时,应该可以访问其参数数据。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...