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


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

    然而现在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>
    
    • 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。

  • 相关阅读:
    等级保护测评需要多长时间 ?
    力扣:70. 爬楼梯
    【Rust】4 一文讲解重点 pattern matching | trait | 生命周期 | 闭包 | 迭代器 | 智能指针 | 并发与并行
    2000-2021年上市公司M&A并购溢价计算数据(含原始数据+Stata代码)
    HTML静态网页成品作业(HTML+CSS)—— 名人霍金介绍网页(6个页面)
    浅谈线性化
    使用前缀和数组解决“区间和查询“问题
    一些bug总结
    LeetCode刷题——146. LRU 缓存(HOT100)
    ssm+springmvc基于springboot的宠物领养系统的设计与实现_j5fk4
  • 原文地址:https://blog.csdn.net/qq_38350635/article/details/126785673