物料按钮切换组单选

时间:2019-07-18 08:57:03

标签: android kotlin android-button

如何总是强制 MaterialButtonToggleGroup 像RadioGroup一样,始终具有至少一个选定的项目?设置setSingleSelection(true)还会增加以下可能性:如果您在组中的“按钮”上单击两次,则没有任何选择。

这是我的代码:

<com.google.android.material.button.MaterialButtonToggleGroup
            android:id="@id/BottomSheetDialog_fromFragmentBottomSheetSort_Sort_ToggleButtonGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            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_width="wrap_content"
                android:layout_height="wrap_content"
                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_width="wrap_content"
                android:layout_height="wrap_content"
                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” 时,如果我单击一个已经选中的按钮,它也会取消选中该按钮,而不会在组中选中任何按钮。

5 个答案:

答案 0 :(得分:11)

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

selectionRequired

答案 1 :(得分:7)

重写toggle()类的MaterialButton方法并使用它代替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 :(得分:7)

现在,您可以使用 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

答案 3 :(得分:1)

如果您真的想这样做,可以在Kotlin中以这种方式进行。

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

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

答案 4 :(得分:0)

使用您需要在MaterialButtonToggleGroup

中使用 app:singleSelection="true"

我正在使用implementation 'com.google.android.material:material:1.1.0-alpha06'

尝试一下

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

            <com.google.android.material.button.MaterialButton
                style="?attr/materialButtonOutlinedStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="A" />

            <com.google.android.material.button.MaterialButton
                style="?attr/materialButtonOutlinedStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="B" />

            <com.google.android.material.button.MaterialButton
                style="?attr/materialButtonOutlinedStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="C" />

            <com.google.android.material.button.MaterialButton
                style="?attr/materialButtonOutlinedStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="D" />

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

更新

        <com.google.android.material.button.MaterialButtonToggleGroup
            android:id="@+id/BottomSheetDialog_fromFragmentBottomSheetSort_Sort_ToggleButtonGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            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_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="A"
                app:backgroundTint="@color/colorBlue"
                style="@style/Widget.MaterialComponents.Button.OutlinedButton"/>

            <com.google.android.material.button.MaterialButton
                android:id="@+id/BottomSheetDialog_fromFragmentBottomSheetSort_Sort_ToggleButtonGroup_Descending"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="B"
                app:backgroundTint="@color/colorBlue"
                style="@style/Widget.MaterialComponents.Button.OutlinedButton"/>
        </com.google.android.material.button.MaterialButtonToggleGroup>