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
不起作用,我可以在 Activity
或 Fragment
中使用 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
我在 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
不起作用,我可以在 Activity
或 Fragment
中使用 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