我的安卓应用程序中有一个表单,它用ViewPager在多个页面上传播。
为了保持简单,它只返回View对象,而不是实例化片段。
每个视图由布局和视图模型(用于所有视图的相同实例)和数据绑定组成,以自动设置值。
问题是,如果复选框在加载活动时处于不在前面的视图中,则复选框没有填充,并且有一个白色复选框。
如果我更改了顺序,所以我的视图和复选框是由ViewPager加载的第一个复选框,我可以看到复选框被选中(带有动画),并且它们被正确地标记。
请参阅所附的截图:
我的单选按钮也有同样的问题。
复选框数据库的示例:
<CheckBox
android:id="@+id/checkbox_calling"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_weight="1"
android:checked="@={viewModel.observation.calling}"
android:text="@string/label_calling" />
更新:
我目前已经通过在OnPageChangeListener
上设置ViewPager
来解决这个问题,当ViewPager
滚动到带有复选框的页面时,我取消选中复选框,然后将它们设置为原始值。
然后动画将正确显示,复选框以正确的复选标记结束。
不过,我仍然希望能找到我做错了什么,或者Android数据库本身是否有问题。
发布于 2018-01-20 00:41:10
我认为这与复选框动画的方式有关。因此,我查看了如何跳过动画,并在复选框jumpDrawablesToCurrentState
上调用了,在检查之后,它对我起了很大作用。
发布于 2019-10-23 15:05:40
我创建这个Kotlin扩张性质是为了解决这个问题(显然只有当您编写Kotlin代码而不是Java时才有用)
/**
* Set the state of a checkbox skipping animations.
*/
var CheckBox.checked: Boolean
get() = isChecked
set(value) {
if(isChecked != value) {
isChecked = value
jumpDrawablesToCurrentState()
}
}
现在,在我的代码中,我编写了checkbox_view.checked = true
而不是checkbox_view.isChecked = true
发布于 2020-02-27 08:54:39
接受Vivere的答复完美地解释了这个问题和解决方案。
Clyde的扩展解是一个好主意,但它给我带来了一些问题。我做了些小改动就把它修好了。
我的最后一段代码:
/**
* Do not animate the check, but check it directly, due to issue in combination with ViewPager:
* https://stackoverflow.com/questions/42997873/android-checkboxes-not-checked-correctly-in-viewpager-with-data-binding
*/
var CompoundButton.isCheckedInViewPager: Boolean
get() = isChecked
set(value) {
if (isChecked != value) {
isChecked = value
}
jumpDrawablesToCurrentState()
}
我对克莱德的代码有什么意见?
我的复选框位于ViewPager的第3页。为了想象发生的事情,我添加了一些日志:
var CompoundButton.isCheckedInViewPager: Boolean
get() = isChecked
set(value) {
Log.d("TEST", "set")
if (isChecked != value) {
Log.d("TEST", "value: $value")
Log.d("TEST", "isChecked: $isChecked")
isChecked = value
Log.d("TEST", "isChecked: $isChecked")
}
jumpDrawablesToCurrentState()
}
日志:
// Navigate from page 1 to page 2 (page 3 with the checkbox is loaded due to the ViewPager):
...: set
...: value: true
...: isChecked: false
...: isChecked: true
// Navigate to page 3 to verify the checkbox's visual state
// Navigate back to page 1 and forward to page 2 again
...: set
// Navigate to page 3 to verify the checkbox's visual state
所以,当我第一次导航到复选框时,一切都会好起来的。如果我再次回到第1次和第3次,在Clyde的解决方案中再次不选中复选框,因为if (isChecked != value)
是假的:jumpDrawablesToCurrentState
不会被调用,问题仍然会出现。
ps。为了清楚起见:复选框将通过观察我的onViewCreated
中的LiveData<Boolean>
来选中ViewModel
。默认情况下,此值为true,因此应选中复选框。
注:
除了解决这段代码的问题之外,我还扩展了CompoundButton以支持RadioButtons。
最后,isCheckedInViewPager更好地描述了何时使用它,如果另一个开发人员开始调用isChecked (多亏了自动完成),它不会那么容易被忘记。
https://stackoverflow.com/questions/42997873
复制相似问题