Two-way 设备旋转后 DataBinding 出错

Two-way DataBinding went wrong after device rotation

我使用 Android 数据绑定库 (Two-way)LiveData (绑定语法 @={})

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

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

问题发生在 activity 旋转后 re-created 时,因此我可以通过设置 activity 的 android:configChanges 来防止这种情况发生。 但是我很好奇这个问题的根源如何解决它。

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


源代码

将此行添加到清单文件中的 activity,

android:configChanges="keyboardHidden|orientation|screenSize"

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

对于关心这个问题的人来说,原因似乎与表单行布局中editText的ID有关(Layout for a row (1 TextView & 1 EditText)),即android:id=在本例中为“@+id/editTextID”。

名字、姓氏和密码的三行使用相同的行布局创建,因此这些字段的 editTexts 具有相同的 ID。

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

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