提问者:小点点

复选框父子关系android


我想根据https://material.io/components/selection-controls#Checkbox中给出的材料设计指南,在Android中为Checkbox创建一个父子关系。

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

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

如果选中了一些(而不是全部)子复选框,则父复选框将成为不确定复选框。

我勾选了developer docs https://developer.android.com/guide/topics/ui/controls/checkbox,但没有相关信息。

此外,我还查看了material design文档https://material.io/developer/android/components/checkbox/,他们给出了这样做的指导方针,但是,他们还没有给出任何这样做的示例项目。

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


共1个答案

匿名用户

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

请参阅此处设置侦听器:https://developer.android.com/reference/android/widget/CompoundButton#SetOnCheckedChangeListener(Android.widget.comCompoundButton.OnCheckedChangeListener)

下面是一个例子:

    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复选框中--它只能被“选中”或“未选中”。 您需要为此使用自定义的东西。 也许这个库对您会有用:https://github.com/sevar83/indexterminate-checkbox

如果您决定使用此库,则似乎需要使用SetOnStateChangedListener而不是SetOnCheckedChangeListener,但想法保持不变。