复选框父子关系android

问题描述 投票:0回答:1

我想根据https://material.io/components/selection-controls#checkboxes中提供的材料设计指南为Android中的Checkbox创建父子关系。

我希望有一个父复选框,下面将有子复选框,并且当选中父复选框时,所有子复选框都被选中。

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

如果选中了某些但不是全部子复选框,则父复选框变成不确定的复选框。

我检查了开发人员文档https://developer.android.com/guide/topics/ui/controls/checkbox,但没有有关此的信息。

而且,我检查了材料设计文档https://material.io/develop/android/components/checkbox/,他们给出了执行此操作的准则,但是,他们没有给出任何示例项目来执行此操作。

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

android checkbox parent-child
1个回答
0
投票

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

请参见此处设置监听器:https://developer.android.com/reference/android/widget/CompoundButton#setOnCheckedChangeListener(android.widget.CompoundButton.OnCheckedChangeListener)

这里是一个例子:

    val childCheckBoxes = listOf(checkBox1, checkBox2, checkBox3)
    parentCheckBox.setOnCheckedChangeListener { _, isChecked ->
        childCheckBoxes.forEach {
            it.isChecked = isChecked
        }
    }

同时,听起来您需要向每个子CheckBox添加侦听器,以更新父CheckBox的状态-这样,如果选中了任何子CheckBox,则还将检查父父。请记住,如果您致电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 CheckBox中-只能被“选中”或“未选中”。您将需要为此使用定制的东西。也许这个库对您有用:https://github.com/sevar83/indeterminate-checkbox

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

© www.soinside.com 2019 - 2024. All rights reserved.