android中正确的样式

时间:2019-05-22 18:13:16

标签: android android-styles

我一直在努力更改/覆盖默认样式。 我正在为小部件使用新的材质设计库。 例如,我要覆盖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)并以编程方式进行更改,但这对我来说是错误的,而不是常规的方式...我错了吗?

1 个答案:

答案 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>