赞
踩
最近碰到个有趣的坑,android.widget.Button 在MaterialComponents主题下background无效。于是就简单探究了一番。
发现之前我们创建工程时AS默认为我们的工程添加一个主题(AppTheme),这个主题一般是兼容的主题(AppCompat类型的主题):
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
然而现在AS创建项目时默认主题变了:
<style name="Theme.ThemeTest" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。