Android MaterialButton 设置为 DataBinding 签入 XML

Android MaterialButton Set Check in XML for DataBinding

我在 MaterialButtonToggleGroup:

中使用 MaterialButton
<com.google.android.material.button.MaterialButtonToggleGroup
    android:id="@+id/majors_toggleGroup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp">

    <com.google.android.material.button.MaterialButton
        android:id="@+id/cs_button"
        style="@style/Widget.MaterialComponents.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"                //doesn't work
        android:text="CS" />

    ...

arrtribute android:checked 不起作用,我可以在 ActivityFragment 中使用 setCheck(),但要使用 DataBniding,我必须使用 XML 属性。有帮助吗?

要将 MaterialButton 的初始状态设置为一组按钮中默认选中的按钮,您可以通过在 MaterialButtonToggleGroup 中引用 app:checkedButton 中的按钮 ID 来实现

因此,在您的代码中:

<com.google.android.material.button.MaterialButtonToggleGroup
    android:id="@+id/majors_toggleGroup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:checkedButton="@+id/cs_button" 
    android:layout_marginTop="8dp">

    <com.google.android.material.button.MaterialButton
        android:id="@+id/cs_button"
        style="@style/Widget.MaterialComponents.Button.OutlinedButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CS" />

    ...

您也可以查看 documentation

最后不得不用BindingAdapter函数来实现这个功能

1.创建 BindingAdapter 函数:

object DataBindingUtil {
    @BindingAdapter("checkedIndexes")        //custom attribute
    @JvmStatic
    fun setChecked(toggleGroup: MaterialButtonToggleGroup, checkedIndexes: List<Int>) {
        checkedIndexes.forEach {
            (toggleGroup.getChildAt(it) as MaterialButton).isChecked = true
        }
    }
}

2。适用于 MaterialButtonToggleGroup:

<com.google.android.material.button.MaterialButtonToggleGroup
    android:id="@+id/majors_toggleGroup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    app:checkedIndexes="@{viewModel.majorIndexes}">    //here, multi-selection for now