最近碰到个有趣的坑,android.widget.Button 在MaterialComponents主题下background无效。于是就简单探究了一番。
发现之前我们创建工程时AS默认为我们的工程添加一个主题(AppTheme),这个主题一般是兼容的主题(AppCompat类型的主题):
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
- "colorPrimary"
>@color/colorPrimary
- "colorPrimaryDark"
>@color/colorPrimaryDark
- "colorAccent">@color/colorAccent
style>
然而现在AS创建项目时默认主题变了:
<style name="Theme.ThemeTest" parent="Theme.MaterialComponents.DayNight.NoActionBar">
- "colorPrimary"
>@color/purple_500
- "colorPrimaryVariant"
>@color/purple_700
- "colorOnPrimary">@color/white
- "colorSecondary">@color/teal_200
- "colorSecondaryVariant">@color/teal_700
- "colorOnSecondary">@color/black
- "android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant
style>
可见主题变成了MaterialDesign风格的,我们如果一直查看父主题的话会发现,这一些列的主题最终会继承AppCompat主题。
然而就是这个MaterialComponentsXXX系列的主题下与android.widget.Button之间存在bg兼容问题。
那么如何解决呢?Theme.MaterialComponents主题下想要按钮生效,简单探究得出了如下结论:
(1)修改主题添加Bridge结尾的主题如下,此时Button#background属性可生效。
Theme.MaterialComponents.DayNight.DarkActionBar.Bridge
(2)修改自己的控件为AppCompatButton,使用兼容控件时,AppCompatButton#background也可生效。
(3)更换api使用backgroundTint方法,使用这个api时Button的backgroundTint会生效,也可达到替换背景的效果。但是需要留意
方案很简单,一旦涉及自己的项目那可能有点麻烦,诸如修改为Bridge主题,app的好多UI变动了之类的,我们项目中碰到的是三方aar使用的还是Button,还好aar提供的有源码,我们吧源码给他改了兼容控件解决了(这个bug必须给sdk提,嘿嘿嘿~)
最后有个疑问?Bridge中如何实现Button的主题兼容设置的,沿着这条路可以探索一番~ 看看能否自定义主题来解决这个兼容问题,让Button在我们自定义的主题下也能修改bg。