Android 设备旋转后,双向数据绑定出错

Android 设备旋转后,双向数据绑定出错,android,android-databinding,android-architecture-components,androidx,two-way-binding,Android,Android Databinding,Android Architecture Components,Androidx,Two Way Binding,我使用Android数据绑定库(双向)和LiveData(绑定语法@={}) 为了重用UI,我在设计布局文件时大量使用了包含布局机制。 实际上,在构建表单布局时,我多次包含同一布局文件 在设备旋转之前,一切都很顺利。设备旋转后,所有字段(editText)获得与最后一行相同的值(如下图所示) 当在旋转之后重新创建活动时会出现问题,因此我可以通过设置活动的android:configChanges来防止这种情况。 但是我很好奇这个问题的根源,以及如何解决它 您可以在下面或下面找到源代码的主要部分。

我使用Android数据绑定库(双向)LiveData(绑定语法@={})

为了重用UI,我在设计布局文件时大量使用了包含布局机制。 实际上,在构建表单布局时,我多次包含同一布局文件

在设备旋转之前,一切都很顺利。设备旋转后,所有字段(editText)获得与最后一行相同的值(如下图所示)

当在旋转之后重新创建活动时会出现问题,因此我可以通过设置活动的android:configChanges来防止这种情况。 但是我很好奇这个问题的根源,以及如何解决它

您可以在下面或下面找到源代码的主要部分。 提前谢谢


源代码

  • 行的布局(1个文本视图和1个编辑文本)

  • 在主布局中重复使用布局2次以上

  • 视图模型

  • 主要活动-在OnCreate中绑定


将此行添加到清单文件中的活动中

android:configChanges="keyboardHidden|orientation|screenSize"

您需要删除这一行
binding.setLifecycleOwner(this)。我确实验证了我自己。

对于可能关心这个问题的人来说,原因似乎与表单行布局(一行布局(1 TextView和1 editText))中editText的ID有关,即在本例中为android:ID=“@+ID/editTextID”

使用相同的行布局创建三行名、姓和密码,以便这些字段的EditText具有相同的ID

在轮换之后,框架可以通知最后一行(密码)的编辑文本中的更改,但前两行也会收到这些更新。这可能是问题的根源

要解决此问题,只需删除行布局中的android:id=“@+id/editTextID”。
与ViewModel或其生命周期无关。

当您旋转设备时,您的活动将被重新创建,因此所有资源都将被分配新的内存和引用,这就是数据绑定无法工作的原因。您可以通过多种方法解决此问题,1。阻止从上面2开始重新创建活动。使用savedInstance保存应用程序的状态,并在创建活动3后再次设置。您还可以使用lifecycler observer组件来解决此问题。实际上,数据绑定框架保留ViewModel,因此旋转前后的ViewModel相同(选中)。但奇怪的事情发生了,如问题所示。解决方案3(如何)是什么意思@HardikChauhan进一步了解
ViewModel
是的,我知道ViewModel可以在onconfigurationchange中生存。您只需删除这一行
binding.setLifecycleOwner(此)您是否有机会查看答案?您好,如果您删除此视图的id,如果您需要访问其他属性,如何找到它?还有别的办法解决这个问题吗?感谢youTry findviewwithtag!哦,不,要使LiveData工作,它应该绑定到lifeCycleOwner。