Android 根据不同的主题设计不同的ui

当公司有多个app,app主题又不一样,有些模块在多个app上都有引用,这时候这个模块就需要适配不同app了。不同效果图如下,可以看到字体颜色、背景颜色、圆角大小,切图icon等不一样
企业微信截图_20230214135456.png

企业微信截图_20230214135558.png

此时的解决办法如下:
1.先在values/attrs.xml下定义颜色属性(具体format类型可搜索关键词:Android attr format属性详解):

<attr name="charging_color9" format="reference|color"/>
<attr name="charging_img1" format="reference|color"/>

2.在values/style.xml中创建不同主题:

<style name="AppTheme_app_A" parent="AppTheme">
  <item name="charging_color9">@color/color_333333</item>
<item name="charging_img1">@mipmap/icon_home_charge_a</item>
</style>
<style name="AppTheme_app_B" parent="AppTheme">
  <item name="charging_color9">@color/color_222222</item>
<item name="charging_img1">@mipmap/icon_home_charge_b</item>
</style>
<style name="AppTheme_app_C" parent="AppTheme">
  <item name="charging_color9">@color/color_111111</item>
<item name="charging_img1">@mipmap/icon_home_charge_c</item>
</style>

3.在BaseActivity中写如下代码:

override fun onCreate(savedInstanceState: Bundle?) {
  when(app_type){
    A->{
      setTheme(R.style.AppTheme_app_A)
    }
    B->{
      setTheme(R.style.AppTheme_app_B)
    }
    else->{
      setTheme(R.style.AppTheme_app_C)
    }
  }
  super.onCreate(savedInstanceState)
}

如果为了在打包不同app时,不增加包体积,不相关的图片icon和assets不会打包,可以在模块的build.gradle进行设置:

sourceSets {
        main {
             if (appType()== "A") {//app_A
                res {
                    srcDirs 'src/main/res', 'src/main/a_res'
                }
                assets{
                    srcDirs 'src/main/assets', 'src/main/a_assets'
                }
            }else if (appType() == "B") {//app_B
                res {
                    srcDirs 'src/main/res', 'src/main/b_res'
                }
                assets{
                    srcDirs 'src/main/assets', 'src/main/b_assets'
                }
            } else if (appType() == "C") {//app_C
                res {
                    srcDirs 'src/main/res', 'src/main/c_res'
                }
                assets{
                    srcDirs 'src/main/assets', 'src/main/c_assets'
                }
            }else {
                res {
                    srcDirs 'src/main/res'
                }
                assets{
                    srcDirs 'src/main/assets'
                }
            }
        }
    }

在不同app的build.gradle中定义

def appType(){
    return ''A''
    //return ''B''
    //return ''C''
}

然后在模块的res同级目录下新建相应的文件夹:

a_res
a_assets
b_res
b_assets
c_res
c_assets

然后把相应的资源文件复制到相应的文件夹下,此时布局中的imageview引用图片资源时可以不用改名区分了。例如:在a_res下的mipmap有个名叫icon_more.png,那么b_res下的mipmap和c_res下的mipmap也可以取icon_more.png
这样就ok了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容