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 找到源代码的主要部分。
提前致谢。
源代码
- 一行的布局(1 个 TextView 和 1 个 EditText)
在主布局中重复使用上面的布局2次
ViewModel
主要activity - OnCreate中的绑定
将此行添加到清单文件中的 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 或其生命周期无关。
我使用 Android 数据绑定库 (Two-way) 和 LiveData (绑定语法 @={})
为了重用UI,我在设计布局文件时大量使用了include layout机制。 实际上,我在构建表单布局时多次包含同一个布局文件。
在 DEVICE ROTATION 之前一切顺利。设备旋转后,所有字段(editText)得到与最后一行相同的值(如下图所示)。
问题发生在 activity 旋转后 re-created 时,因此我可以通过设置 activity 的 android:configChanges 来防止这种情况发生。 但是我很好奇这个问题的根源和如何解决它。。
您可以在下面或 full source code 找到源代码的主要部分。 提前致谢。
源代码
- 一行的布局(1 个 TextView 和 1 个 EditText)
在主布局中重复使用上面的布局2次
ViewModel
主要activity - OnCreate中的绑定
将此行添加到清单文件中的 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 或其生命周期无关。