Android 复选框父子关系

Android 复选框父子关系,android,checkbox,parent-child,Android,Checkbox,Parent Child,我想根据中给出的材料设计准则,在Android中为Checkbox创建父子关系 我想要一个父复选框,在该复选框下将有子复选框,当选中父复选框时,所有子复选框都将被选中 如果父复选框未选中,则所有子复选框均未选中 如果选中了部分(但不是全部)子复选框,则父复选框将变为不确定复选框 我查看了开发人员文档,但没有这方面的信息 此外,我检查了材料设计文档,他们给出了相同的指南,但是,他们没有给出任何示例项目来执行相同的操作 我尝试使用嵌套创建复选框的父子关系,但没有成功。有人知道如何实现这一点吗?您需要

我想根据中给出的材料设计准则,在Android中为Checkbox创建父子关系

我想要一个父复选框,在该复选框下将有子复选框,当选中父复选框时,所有子复选框都将被选中

如果父复选框未选中,则所有子复选框均未选中

如果选中了部分(但不是全部)子复选框,则父复选框将变为不确定复选框

我查看了开发人员文档,但没有这方面的信息

此外,我检查了材料设计文档,他们给出了相同的指南,但是,他们没有给出任何示例项目来执行相同的操作


我尝试使用嵌套创建复选框的父子关系,但没有成功。有人知道如何实现这一点吗?

您需要在“父”复选框上设置一个侦听器,以便在“父”复选框的状态更改时切换“子”复选框

请参见此处设置侦听器:

下面是一个例子:

    val childCheckBoxes = listOf(checkBox1, checkBox2, checkBox3)
    parentCheckBox.setOnCheckedChangeListener { _, isChecked ->
        childCheckBoxes.forEach {
            it.isChecked = isChecked
        }
    }
同时,听起来您需要将侦听器添加到每个子复选框中,以更新父复选框状态-这样,如果选中了任何子复选框,父复选框也会被选中。记住,如果你打电话
parentCheckBox.isChecked=true
它还将调用
parentCheckBox
的OnCheckedChangeListener,最终得到无限递归。因此,当您这样设置
isChecked
时,可能需要禁用OnCheckedChangeListener。可能是这样的:

val theRealListener = { _, isChecked ->
        childCheckBoxes.forEach {
            it.isChecked = isChecked
        }
    }
parentCheckBox.setOnCheckedChangeListener(null)
parentCheckBox.isChecked = whatever
parentCheckBox.setOnCheckedChangeListener(theRealListener)
默认Android复选框中不包括“不确定”状态-只能“选中”或“未选中”。您需要为此使用一些自定义的东西。也许此库对您有用:


如果您决定使用此库,看起来您需要使用
setOnStateChangedListener
而不是
setOnCheckedChangeListener
,但想法保持不变。

您需要在“父”复选框上设置一个侦听器,以便在“父”复选框的状态更改时切换“子”复选框

请参见此处设置侦听器:

下面是一个例子:

    val childCheckBoxes = listOf(checkBox1, checkBox2, checkBox3)
    parentCheckBox.setOnCheckedChangeListener { _, isChecked ->
        childCheckBoxes.forEach {
            it.isChecked = isChecked
        }
    }
同时,听起来您需要将侦听器添加到每个子复选框中,以更新父复选框状态-这样,如果选中了任何子复选框,父复选框也会被选中。记住,如果你打电话
parentCheckBox.isChecked=true
它还将调用
parentCheckBox
的OnCheckedChangeListener,最终得到无限递归。因此,当您这样设置
isChecked
时,可能需要禁用OnCheckedChangeListener。可能是这样的:

val theRealListener = { _, isChecked ->
        childCheckBoxes.forEach {
            it.isChecked = isChecked
        }
    }
parentCheckBox.setOnCheckedChangeListener(null)
parentCheckBox.isChecked = whatever
parentCheckBox.setOnCheckedChangeListener(theRealListener)
默认Android复选框中不包括“不确定”状态-只能“选中”或“未选中”。您需要为此使用一些自定义的东西。也许此库对您有用:

如果您决定使用此库,看起来您将需要使用
setOnStateChangedListener
而不是
setOnCheckedChangeListener
,但想法不变