Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在ViewPager中没有正确选中带有数据绑定的Android复选框

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

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

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

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

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

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

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

请参阅所附的截图:

视图不是第一个加载的

视图是第一个加载的

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

复选框数据库的示例:

代码语言:javascript
运行
AI代码解释
复制
<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 00:41:10

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

票数 14
EN

Stack Overflow用户

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

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

代码语言:javascript
运行
AI代码解释
复制
/**
 * 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 08:54:39

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

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

我的最后一段代码:

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

复制
相关文章
如何使用.gitignore忽略Git中的文件和目录
通常,在项目上使用Git的工作时,你会希望排除将特定文件或目录推送到远程仓库库中的情况。.gitignore文件可以指定Git应该忽略的未跟踪文件。 在本教程中,我们将说明如何使用.gitignore
入门笔记
2022/06/02
9.3K0
如何在git中删除指定的文件和目录
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113172.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
3.6K0
.gitignore 忽略文件和目录
.gitignore 文件的作用就是告诉 git 哪些文件不需要添加到版本管理中(定义忽略提交的文件)
很酷的站长
2023/01/10
2.8K0
.gitignore 忽略文件和目录
git中忽略指定文件
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caomage/article/details/82844233
从入门到进错门
2018/10/10
7560
git忽略上传文件git忽略上传文件
第一步 在项目目录新建.gitignore文件 第二步 配置文件 文件名可以使用正则匹配 # Default ignored files # 比如常见的.idea .idea
小小咸鱼YwY
2020/06/19
4.1K0
在 Linux 中永久并安全删除文件和目录的方法
引言 在大多数情况下,我们习惯于使用 Delete 键、垃圾箱或 rm 命令从我们的计算机中删除文件,但这不是永久安全地从硬盘中(或任何存储介质)删除文件的方法。 该文件只是对用户隐藏,它驻留在硬盘上的某个地方。它有可能被数据窃贼、执法取证或其它方式来恢复。 假设文件包含密级或机密内容,例如安全系统的用户名和密码,具有必要知识和技能的攻击者可以轻松地恢复删除文件的副本并访问这些用户凭证(你可以猜测到这种情况的后果)。 在本文中,我们将解释一些命令行工具,用于永久并安全地删除 Linux 中的文件。 1.
小小科
2018/05/04
4.7K0
在 Linux 中永久并安全删除文件和目录的方法
寻找并删除Git记录中的大文件
有时候gitignore没做好,一不小心就又进来一个二进制文件 在重复了N次Google之后,还是记一下吧 首先通过rev-list来找到仓库记录中的大文件: 1 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')" 然后通过filter-branch来重写这些大文件涉及到的所有提交(重写历史记录): 1 g
happy123.me
2018/06/04
3.5K0
如何在Python中删除(删除)文件和目录
本教程说明了如何使用os,pathlib和shutil模块中的功能删除文件和目录。
用户5005176
2021/08/10
13.1K0
在 Linux 中永久并安全删除文件和目录 只需这 3 招
在大多数情况下,我们习惯于使用 Delete 键、垃圾箱或 rm 命令从我们的计算机中删除文件,但这不是永久安全地从硬盘中(或任何存储介质)删除文件的方法。
哲洛不闹
2018/09/14
2.6K0
在 Linux 中永久并安全删除文件和目录 只需这 3 招
git: .gitignore文件 (忽略文件)
Note: 切记目录名后面 一定要加 反斜杠 / ,不然会当成 单文件 处理。
JNingWei
2018/09/27
2.2K0
git: .gitignore文件 (忽略文件)
git全局忽略文件
前阵子做项目时偶然发现自己本地的某个index.js文件无法加入版本库,sourceTree里面一直看不到文件(且项目下面的gitignore文件并没有记录此文件),尝试执行 git add file_name 去手动添加文件。
薛定喵君
2021/05/20
2.1K0
git 忽略 .idea文件
多人开发时,会出现明明在gitignore中忽略了.idea文件夹,但是提交时仍旧会出现.idea内文件变动的情况
韩旭051
2021/05/11
2.7K0
iOS git忽略文件
我的iOS开发时的忽略文件配置 # Xcode *.xccheckout UserInterfaceState.xcuserstate contents.xcworkspacedata build/ *.moved-aside DerivedData *.hmap *.ipa # CocoaPods Pods/ .idea/ *.xcbkptlist
码客说
2019/10/22
1.2K0
android git忽略文件
我的Android开发时的忽略文件配置 #Android generated bin gen gen* #Eclipse .project .classpath .settings #IntelliJ IDEA .idea *.iml *.ipr *.iws out #Maven target release.properties pom.xml.* #Ant build.xml local.properties proguard.cfg #Gradle .gradle build #OSX .
码客说
2019/10/22
9330
git忽略文件追踪
git忽略追踪文件包括两种,一种是未提交到git仓库的文件,一种是已经提交到git仓库中的文件。
党志强
2020/01/23
2K0
Git忽略已经提交过一次文件Git忽略文件
也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件
iOSDevLog
2020/07/03
2.5K0
文件中查找并删除<feff>
字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。 有时候会在处理文本中碰到,需要对其处理,处理方法如下: 删除 :g/[\uFEFF]/d 查找 /[\uFEFF] Python \ufeff
Tyan
2017/12/28
3.3K0
如何删除 Linux 中的空文件和目录?
在 Linux 系统中,有时我们需要删除空的文件和目录。空文件和目录不包含任何内容,它们可能是我们意外创建的或者是不再需要的。本文将详细介绍如何在 Linux 中删除空文件和目录,同时提供多个实际示例,以便您能够轻松地完成这个任务。
网络技术联盟站
2023/08/03
6270
如何删除 Linux 中的空文件和目录?
Git忽略已经提交过一次文件Git忽略文件
1、从未提交过的文件可以用.gitignore 也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件
超级小可爱
2023/02/23
6300
点击加载更多

相似问题

如何从SVN存储库中删除文件/文件夹并添加到忽略列表

510

从git存储库中删除忽略的文件

12

如何从git存储库中删除*所有*文件和目录?

14

如何从git库中删除被忽略的文件

11

从git中删除和忽略文件,但不要删除所有文件

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文