芯片组单选

新手上路,请多包涵

我怎样才能强制 ChipGroupRadioGroup 一样总是至少有一个选定的项目?设置 setSingleSelection(true) 还增加了如果您在 Chip 上单击两次则没有任何选择的可能性。

原文由 adriennoir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
2 个回答

为防止取消选择所有芯片,您可以使用方法 setSelectionRequired

 chipGroup.setSelectionRequired(true)

您还可以使用 app:selectionRequired 属性在布局中定义它:

 <com.google.android.material.chip.ChipGroup
    app:singleSelection="true"
    app:selectionRequired="true"
    app:checkedChip="@id/..."
    ..>

注意: 这需要至少 1.2.0 版本

原文由 Gabriele Mariotti 发布,翻译遵循 CC BY-SA 4.0 许可协议

编辑

随着版本 1.2.0-alpha02 不再需要 的 hacky 解决方案!

要么使用属性 app:selectionRequired="true"


<com.google.android.material.chip.ChipGroup
            android:id="@+id/group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:selectionRequired="true"
            app:singleSelection="true">

  (...)
</com.google.android.material.chip.ChipGroup>

或者在代码中


// Kotlin
group.isSelectionRequired = true

// Java
group.setSelectionRequired(true);


对于旧版本👇

有两个步骤可以实现这一点

步骤1

我们内置了此支持,只需确保将 app:singleSelection="true" 添加到您的 ChipGroup ,例如:

XML

 <com.google.android.material.chip.ChipGroup
            android:id="@+id/group"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:singleSelection="true">

        <com.google.android.material.chip.Chip
                android:id="@+id/option_1"
                style="@style/Widget.MaterialComponents.Chip.Choice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Option 1" />

        <com.google.android.material.chip.Chip
                android:id="@+id/option_2"
                style="@style/Widget.MaterialComponents.Chip.Choice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Option 2" />
</com.google.android.material.chip.ChipGroup>

代码


// Kotlin
group.isSingleSelection = true

// Java
group.setSingleSelection(true);

第2步

现在支持类似功能的广播组:


var lastCheckedId = View.NO_ID
chipGroup.setOnCheckedChangeListener { group, checkedId ->
    if(checkedId == View.NO_ID) {
        // User tried to uncheck, make sure to keep the chip checked
        group.check(lastCheckedId)
        return@setOnCheckedChangeListener
    }
    lastCheckedId = checkedId

    // New selection happened, do your logic here.
    (...)

}

文档

ChipGroup 还支持一组芯片的多重排除范围。当您设置 app:singleSelection 属性时,选中属于芯片组的一个芯片会取消选中同一组中任何先前选中的芯片。该行为反映了 RadioGroup 的行为。

原文由 Joaquim Ley 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题