当前位置:   article > 正文

Android Button#background 在MaterialComponents主题下无效问题

Android Button#background 在MaterialComponents主题下无效问题

最近碰到个有趣的坑,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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然而现在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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

可见主题变成了MaterialDesign风格的,我们如果一直查看父主题的话会发现,这一些列的主题最终会继承AppCompat主题。

然而就是这个MaterialComponentsXXX系列的主题下与android.widget.Button之间存在bg兼容问题。

那么如何解决呢?Theme.MaterialComponents主题下想要按钮生效,简单探究得出了如下结论:

(1)修改主题添加Bridge结尾的主题如下,此时Button#background属性可生效。

Theme.MaterialComponents.DayNight.DarkActionBar.Bridge
  • 1

(2)修改自己的控件为AppCompatButton,使用兼容控件时,AppCompatButton#background也可生效。

(3)更换api使用backgroundTint方法,使用这个api时Button的backgroundTint会生效,也可达到替换背景的效果。但是需要留意

  • 这个api不能与background同时用,否则颜色变为默认色,不生效。
  • MaterialComponents主题下AppCompatButton#backgroundTint是无效的。

方案很简单,一旦涉及自己的项目那可能有点麻烦,诸如修改为Bridge主题,app的好多UI变动了之类的,我们项目中碰到的是三方aar使用的还是Button,还好aar提供的有源码,我们吧源码给他改了兼容控件解决了(这个bug必须给sdk提,嘿嘿嘿~)

最后有个疑问?Bridge中如何实现Button的主题兼容设置的,沿着这条路可以探索一番~ 看看能否自定义主题来解决这个兼容问题,让Button在我们自定义的主题下也能修改bg。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/257954
推荐阅读
相关标签
  

闽ICP备14008679号