我想根据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/,他们给出了执行此操作的准则,但是,他们没有给出任何示例项目来执行此操作。
我尝试使用嵌套创建带有复选框的父子关系,但这没有用。有没有人知道如何实现这一目标?
[您将需要在“父”复选框上设置一个侦听器,以在“父”复选框的状态更改时切换“子”复选框。
这里是一个例子:
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
,但想法保持不变。