首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在ViewPager中没有正确选中带有数据绑定的Android复选框

在ViewPager中没有正确选中带有数据绑定的Android复选框
EN

Stack Overflow用户
提问于 2017-03-24 09:52:28
回答 4查看 2.5K关注 0票数 7

我的安卓应用程序中有一个表单,它用ViewPager在多个页面上传播。

为了保持简单,它只返回View对象,而不是实例化片段。

每个视图由布局和视图模型(用于所有视图的相同实例)和数据绑定组成,以自动设置值。

问题是,如果复选框在加载活动时处于不在前面的视图中,则复选框没有填充,并且有一个白色复选框。

如果我更改了顺序,所以我的视图和复选框是由ViewPager加载的第一个复选框,我可以看到复选框被选中(带有动画),并且它们被正确地标记。

请参阅所附的截图:

视图不是第一个加载的

视图是第一个加载的

我的单选按钮也有同样的问题。

复选框数据库的示例:

代码语言:javascript
运行
复制
<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数据库本身是否有问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-20 08:41:10

我认为这与复选框动画的方式有关。因此,我查看了如何跳过动画,并在复选框jumpDrawablesToCurrentState上调用了,在检查之后,它对我起了很大作用。

票数 14
EN

Stack Overflow用户

发布于 2019-10-23 23:05:40

我创建这个Kotlin扩张性质是为了解决这个问题(显然只有当您编写Kotlin代码而不是Java时才有用)

代码语言:javascript
运行
复制
/**
 * 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

票数 4
EN

Stack Overflow用户

发布于 2020-02-27 16:54:39

接受Vivere的答复完美地解释了这个问题和解决方案。

Clyde的扩展解是一个好主意,但它给我带来了一些问题。我做了些小改动就把它修好了。

我的最后一段代码:

代码语言:javascript
运行
复制
/**
 * 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页。为了想象发生的事情,我添加了一些日志:

代码语言:javascript
运行
复制
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()
    }

日志:

代码语言:javascript
运行
复制
// 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 (多亏了自动完成),它不会那么容易被忘记。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42997873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档