material theme ui 设置_Android 项目中Theme的改造

513cc3492849380e2bf8cf6aba5ca7f9.png作者丨胡笑语

https://juejin.im/post/5dcce129518825108b495e54

前言: 为什么会选这个话题
由于项目老旧,项目里留存了很多古董玩意儿,既然看到了不爽的地方,身为程序员强烈的责任感,不得不进行改造,今天就来说说统一 Android Theme 中遇到的那些事儿
缘由
我们都知道 Android 系统有很严重的碎片化问题,最明显的表象是手机系统升级大多数不能超过两代,什么意思呢? 简单说就是老机器买来是 5.0 系统,基本升不到 8.0 系统或更高。 可能原因有很多,鄙人也不敢随便揣测,那么过程中呢,出现了各种 AppCompat suppor包, 这些包为开发 app 带来兼容体验, 当然过程中可能发现兼容包有些不可控了,所以现在的主推的是 AndroidX,万剑归宗的感觉。 那么Theme 跟这个碎片化有什么关系呢? Theme 也经过了几个版本的流行时代,普通 theme 的写法如下
@android:style/Theme.xxx
4.0 之后流行起了 Materail Design,  Android 系统中也默认自带了 theme
@android:style/Theme.Material.xxx
5.0后推出了 appcompat-v7 中的 theme
@style/Theme.AppCompat.xxx
项目中使用的是最普通的 theme,不支持沉浸式,不支持继承自 AppCompatActivity,也会影响部分系统的导航键层级(实测 MUI系统中使用普通 theme 导航键永远处于 window 的最上层)
步骤一:引用整体替换
把 styles.xml 中 parent  引用自 @android:style/Theme.xxx 全部替换为@style/Theme.AppCompat.xxx 这里可以使用as的 ctrl + R 进行快捷全局替换
步骤二:添加MD支持的属性
在base theme中添加如下属性:
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
  <item name="android:windowNoTitle">trueitem>
  <item name="colorPrimary">#ffffffitem>
  <item name="colorPrimaryDark">#ffffffitem>
  <item name="android:statusBarColor">#ffffffitem>
  <item name="android:windowLightStatusBar">trueitem>
  <item name="android:buttonStyle">@android:style/Widget.Buttonitem>style>
因为 app 中页面头部皆为白色,所以把状态栏属性改为白色 顺手做了下冷启动的 theme, 设置在 SplashActivity 上
<style name="SplashTheme" parent="AppBaseTheme">
  <item name="android:windowBackground">@drawable/splash_bgitem>
  <item name="android:windowLightStatusBar">falseitem>
  <item name="android:windowDrawsSystemBarBackgrounds">falseitem>style>
drawable/splash_bg.xml文件:
<?xml  version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <item>        <color android:color="@android:color/white" />    item>        <itemandroid:bottom="@dimen/hj_dp_45"android:gravity="bottom">        <bitmapandroid:gravity="bottom|center_horizontal"android:src="@drawable/splash_logo" />    item>layer-list>
问题出现与解决
如果不出意外的话,as 已经开始报红色波浪线了,因为styles.xml 中某些属性会有系统兼容的问题,这时候用文件夹兼容方式解决
  • 在 res 下创建文件夹values-v21 及 values-v23
  • -v21 就代表5.0系统会使用该文件夹下的 values 配置
  • -v23 代表6.0系统会使用文件夹下的 values 配置
  • 综上配置,Android 系统会在5.0以下系统选择 values 配置,5.0 - 5.1 选择 values-v21 配置, 6.0+ 会选择values-v23配置
当然这些操作可以用as 中解决问题快捷键 alt + enter 来自动创建对应的样式 这样做了以后,还会出现 5.0系统状态栏白底色把文字颜色混合,导致看不到文字,直接改成黑色:
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
  <item name="android:windowNoTitle">trueitem>
  <item name="colorPrimary">#ffffffitem>
  <item name="colorPrimaryDark">#ffffffitem>
  <item name="android:statusBarColor">#000000item>
  <item name="android:buttonStyle">@android:style/Widget.Buttonitem>style>
后话
对 Theme 的折腾至此告一段落了, 当然如果你的项目中对于每个界面还需要特别细分,比如说状态栏颜色,沉浸式要求。 那么我推荐你一款开源的工具 https://github.com/laobie/StatusBarUtil 应该可以满足大部分开发者的要求 最后谢谢老铁的阅读

513cc3492849380e2bf8cf6aba5ca7f9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值