我一直在努力更改/覆盖默认样式。 我正在为小部件使用新的材质设计库。 例如,我要覆盖MaterialButton样式:
<style name="AppTheme" parent="Theme.MaterialComponents.NoActionBar">
...
<item name="materialButtonStyle">@style/CustomButton</item>
</style>
...
...
<style name="CustomButton" parent="Widget.MaterialComponents.Button">
<item name="android:textColor">@color/colorTextPrimary</item>
<item name="android:backgroundTint">@color/button_background</item>
</style>
背景色为:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:color="@color/colorAccent"/>
<item android:state_enabled="false" android:color="@color/colorDisabled"/>
</selector>
问题是这种方式无法设置禁用颜色的Alpha,因为它仅影响背景颜色,而不影响textColor ... 这种方法的另一个问题是MaterialDesign.Text按钮(Widget.MaterialComponents.Button.TextButton)也将被覆盖并中断...
我在其他小部件(例如TextView,InputFields)中遇到了非常相似的问题。 在不破坏任何样式的情况下覆盖不同样式的正确方法是什么?我一直在考虑扩展这些类(例如MaterialButton)并以编程方式进行更改,但这对我来说是错误的,而不是常规的方式...我错了吗?
答案 0 :(得分:0)
您可以使用类似的内容:
<style name="CustomButton" parent="Widget.MaterialComponents.Button">
<item name="android:textColor">@color/color_selector</item>
<item name="backgroundTint">@color/button_background</item>
</style>
其中color_selector是:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorOnPrimary" android:state_enabled="true"/>
<item android:alpha="0.38" android:color="?attr/colorOnSurface"/>
</selector>
和button_background
:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorPrimary" android:state_enabled="true"/>
<item android:alpha="0.12" android:color="?attr/colorOnSurface"/>
</selector>