AppCompat Button样式属性不生效问题及修正方案
AppCompat按钮样式属性不生效的解决方法
我最近也踩过一模一样的坑!你定义了继承自Widget.AppCompat.Button.Colored的ButtonWithBorder样式,但设置的background、colorAccent、colorButtonNormal等属性完全不生效,试了换背景Drawable、调整颜色、改成android:theme都没用对吧?
问题重现
先还原一下你遇到问题时的代码:
按钮样式代码
<style name="ButtonWithBorder" parent="Widget.AppCompat.Button.Colored"> <item name="colorAccent">@color/colorPrimary</item> <item name="colorButtonNormal">@color/colorPrimary</item> <item name="android:textColor">@color/colorAccent</item> <item name="android:textAllCaps">true</item> <item name="background">@drawable/btn_border</item> <item name="android:textSize">@dimen/button_text_size</item> </style>
按钮布局代码
<Button android:id="@+id/descriptionReserveButton" style="@style/ButtonWithBorder" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="12dp" android:layout_alignParentStart="true" android:layout_centerInParent="true" android:text="@string/reserve_place" />
背景Selector代码
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_outline" android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="@color/colorPrimary"/> </shape> </item> <item android:drawable="@drawable/btn_outline" android:state_focused="true"> <shape android:shape="rectangle"> <solid android:color="@color/colorPrimary"/> </shape> </item> <item android:drawable="@drawable/btn_outline"/> </selector>
问题根源
核心问题就出在样式里的background属性上!对于继承自Widget.AppCompat.Button.Colored的样式,不带android:前缀的background无法被AppCompat正确识别,它会优先使用系统默认的按钮背景,导致你自定义的背景Drawable不生效,进而连带影响colorButtonNormal等依赖背景的颜色属性也失效。
解决方案
只需要把样式中的<item name="background">@drawable/btn_border</item>改成带android:前缀的版本即可:
<style name="ButtonWithBorder" parent="Widget.AppCompat.Button.Colored"> <item name="colorAccent">@color/colorPrimary</item> <item name="colorButtonNormal">@color/colorPrimary</item> <item name="android:textColor">@color/colorAccent</item> <item name="android:textAllCaps">true</item> <!-- 添加android:前缀 --> <item name="android:background">@drawable/btn_border</item> <item name="android:textSize">@dimen/button_text_size</item> </style>
修改后,你的自定义背景Drawable会正常生效,同时colorButtonNormal、textColor等其他样式属性也能按预期作用在按钮上,这个样式就可以放心复用啦!
内容的提问来源于stack exchange,提问作者Toper
相关产品推荐
相关产品推荐

