自定义后的材料复选框样式

时间:2019-12-29 14:44:02

标签: android android-custom-view androidx material-components-android

我的自定义复选框(MyCheckboxandroidx.appcompat.widget.AppCompatCheckBox开始扩展,但是默认样式不适用于它。

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    ...
    <item name="android:checkboxStyle">@style/CheckboxTheme</item>
    <item name="checkboxStyle">@style/CheckboxTheme</item>
</style>

<style name="CheckboxTheme" parent="@style/Widget.AppCompat.CompoundButton.CheckBox">
     <!-- for example try to change background -->
    <item name="android:background">@color/colorPrimary</item>
</style>

但未在预览和运行时更改任何内容。

我还迁移了MaterialComponent(从com.google.android.material.checkbox.MaterialCheckBox扩展)版本:

com.google.android.material:material:1.1.0-beta01

,并使用@style/Widget.MaterialComponents.CompoundButton.CheckBox作为样式。但没有改变。

注意: 当我提到每个实例的样式时,此问题就解决了:

            <com.something.MyCheckBox
                android:id="@+id/ch"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="some thing"
                style="@style/CheckboxTheme"
             />

但我想为此类的所有实例设置此样式。 你能帮我吗?

2 个答案:

答案 0 :(得分:0)

根据this answer,我尝试使用ContextThemeWrapper来应用样式:

class MyCheckbox @JvmOverloads constructor(context: Context,
                                        attrs: AttributeSet? = null,
                                        defStyle: Int = 0)
: MaterialCheckBox(ContextThemeWrapper(context, R.style.CheckboxTheme), attrs, defStyle)

答案 1 :(得分:0)

材料组件库提供的MaterialCheckBox使用主题中定义的checkboxStyle属性。
只需覆盖此属性即可在您的应用中全局定义样式:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
   <!-- .... -->
   <item name="checkboxStyle">@style/MyCheckBox</item>
</style>

如果要自定义颜色,可以使用以下样式的 materialThemeOverlay 属性:

<style name="MyCheckBox" parent="@style/Widget.MaterialComponents.CompoundButton.CheckBox">
   <item name="materialThemeOverlay">@style/ThemeOverlay.CheckBox</item>
</style>

具有:

  <style name="ThemeOverlay.CheckBox" parent="">
    <item name="colorSurface">@color/....</item>
    <item name="colorOnSurface">@color/.....</item>
  </style>

只是个笔记。
MaterialCheckBox代码中以编程方式定义了colorTint选择器。您还可以定义自定义colorTint选择器,并以自定义样式添加buttonTint属性。

或者,您也可以在布局中使用android:theme,但不能在全局范围内使用。

<com.google.android.material.checkbox.MaterialCheckBox
    ...
    android:theme="@style/ThemeOverlay.CheckBox"/>