• 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。

  • 相关阅读:
    东软睿驰总裁兼CTO杜强受邀出席 CICV 2024智能网联汽车技术首脑(CTO)闭门峰会
    招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本
    微信公众号与小程序打通:流量变现的新路径
    SpringCloud的新闻资讯项目09 --- 用户行为-需求和接口文档
    fork主仓库后拉取主仓库的最新代码,拉取后更新fork的仓库
    linux系统 系统级日志治理
    SpringBoot概念、创建和运行
    GIt版本回滚的两种方法reset、revert
    JS 根据某一属性值合并两个数组
    【考研高数】学习笔记分享
  • 原文地址:https://blog.csdn.net/qq_38350635/article/details/126785673