材质按钮切换组单选

Posted

技术标签:

【中文标题】材质按钮切换组单选【英文标题】:Material Button Toggle Group single selection 【发布时间】:2019-11-27 03:55:27 【问题描述】:

如何强制 MaterialButtonToggleGroup 像 RadioGroup 一样始终具有至少一个选定项目?设置setSingleSelection(true) 还会增加在组中单击两次按钮时不选择任何内容的可能性。

这是我的代码:

<com.google.android.material.button.MaterialButtonToggleGroup
            android:id="@id/BottomSheetDialog_fromFragmentBottomSheetSort_Sort_ToggleButtonGroup"
            android:layout_
            android:layout_
            app:singleSelection="true"
            app:checkedButton="@+id/BottomSheetDialog_fromFragmentBottomSheetSort_Sort_ToggleButtonGroup_Ascending">

        <com.google.android.material.button.MaterialButton
                android:id="@id/BottomSheetDialog_fromFragmentBottomSheetSort_Sort_ToggleButtonGroup_Ascending"
                android:layout_
                android:layout_
                android:text="@string/Fragment_BottomSheetDialog_Sort_ToggleButton_Ascending"
                app:backgroundTint="@color/custom_button_background_states"
                style="@style/Widget.MaterialComponents.Button.OutlinedButton"/>

        <com.google.android.material.button.MaterialButton
                android:id="@id/BottomSheetDialog_fromFragmentBottomSheetSort_Sort_ToggleButtonGroup_Descending"
                android:layout_
                android:layout_
                android:text="@string/Fragment_BottomSheetDialog_Sort_ToggleButton_Descending"
                app:backgroundTint="@color/custom_button_background_states"
                style="@style/Widget.MaterialComponents.Button.OutlinedButton"/>
    </com.google.android.material.button.MaterialButtonToggleGroup>

如您所见,即使在使用 app:singleSelection="true" 时,如果我单击已选中的按钮,它也会取消选中它,在组中没有选中任何按钮。

【问题讨论】:

你试过app:singleSelection="true"吗,因为对我来说它工作正常 我在上面说过我正在使用 app:singleSelection="true" 并且当我单击该按钮两次时,它取消选中该按钮。 【参考方案1】:

更新:

app:selectionRequired="true" 属性自 1.2.0 版起可用

覆盖MaterialButton类的toggle()方法并使用它代替MaterialButton

import android.content.Context
import android.util.AttributeSet
import com.google.android.material.button.MaterialButton

class CustomMaterialToggleButton : MaterialButton 

    constructor(context: Context) : super(context)

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun toggle() 
        if (!isChecked) 
            super.toggle()
        
    

这将确保已选中的按钮在单选时不会取消选中。

【讨论】:

【参考方案2】:

从1.2.0-alpha03 开始,您可以简单地使用selectionRequired 选项:

<com.google.android.material.button.MaterialButtonToggleGroup
    android:id="@+id/toggle_button_group"
    app:singleSelection="true"
    app:selectionRequired="true">

</com.google.android.material.button.MaterialButtonToggleGroup>

【讨论】:

【参考方案3】:

现在您可以使用 app:selectionRequired 属性来实现它。 比如:

    <com.google.android.material.button.MaterialButtonToggleGroup
        app:singleSelection="true"
        app:selectionRequired="true"
        app:checkedButton="@id/..."
        ..>

您也可以通过编程方式使用方法setSelectionRequired

buttonGroup.setSelectionRequired(true);

请注意,此属性需要最低版本 1.2.0-alpha03

【讨论】:

【参考方案4】:

如果你真的想这样做,你可以在 Kotlin 中这样做。

toggle_group.forEach  button ->
      button.setOnClickListener  (button as MaterialButton).isChecked = true 

这将防止第二次点击取消选中。

【讨论】:

以上是关于材质按钮切换组单选的主要内容,如果未能解决你的问题,请参考以下文章

如何使用QuerySelector从角度材质表单中检索值

如何根据对话框组件中的取消和是按钮更新父组件的材质幻灯片切换值?

导轨视图中的多组单选按钮

3Dmax如何使用mat材质?

javascript Bootstrap按钮组单选按钮

标签和组单选按钮水平对齐