关于Google Pixel,或者安卓16,状态栏颜色无法修改的解决方案

场景

  • 谷哥手机pixel等原生安卓16的系统的状态栏异常显示,无法修改颜色

获取title布局(示例)

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_parent_head"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffffff"
    android:orientation="horizontal">
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/layout_head"
        android:layout_width="match_parent"
        android:layout_height="@dimen/layout_include_title_height"
        android:background="#ffffff"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/back"
            android:layout_width="18dp"
            android:layout_height="26dp"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:background="@drawable/bg_back_title_selector" />
        <TextView
            android:id="@+id/start_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:layout_gravity="center_vertical"
            android:textSize="14sp"
            android:textColor="@color/main_color"
            android:layout_marginStart="10dp"
            android:visibility="gone" />
        <TextView
            android:id="@+id/head_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_weight="1"
            android:ellipsize="end"
            android:layout_gravity="center"
            android:gravity="center"
            android:singleLine="true"
            android:text="@string/Tirepressure_detection"
            android:textColor="@color/main_color"
            android:textSize="16sp" />
        <ImageView
            android:id="@+id/right_img"
            android:layout_width="36dp"
            android:layout_height="40dp"
            android:layout_gravity="center_vertical"
            android:layout_marginRight="8dp"
            android:padding="5dp"
            android:src="@drawable/title_setting"
            android:visibility="invisible" />

        <ImageButton
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_gravity="center_vertical"
            android:layout_marginRight="8dp"
            android:background="@null"
            android:src="@drawable/exchange"
            android:visibility="gone" />

        <TextView
            android:id="@+id/right_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="8dp"
            android:gravity="center"
            android:text="@string/send1"
            android:layout_gravity="end|center_vertical"
            android:textColor="@color/main_color"
            android:textSize="14sp"
            android:visibility="gone" />

        <TextView
            android:layout_width="56dp"
            android:layout_height="40dp"
            android:layout_marginRight="8dp"
            android:gravity="center"
            android:text="@string/send1"
            android:textColor="@color/main_color"
            android:textSize="14sp"
            android:visibility="gone" />
    </FrameLayout>
</FrameLayout>

其中将标题布局包裹在一个FrameLayout里,然后主题里不进行任何状态栏颜色的配置。

使用第三方库或其他安卓原生api获取状态栏高度,手动设置被包裹视图的marginTop。

然后状态栏颜色可以直接用上面布局的FrameLayout背景色控制。如需调整状态栏文字颜色,使用原生api切换白色黑色即可。

此操作适配安卓所有版本。

当然关于Activity的window,需要去除TRANSLATG,FULLSCREEN的flag

java 复制代码
window.clearFlag(
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
)

,布局以及主题也无需设置

xml 复制代码
fitsytemWindow="true"

让状态栏由你自己来托管。

缺点

  • 全屏和非全屏,状态栏需要手动控制
  • 如果xml布局不规则,需要手动修改的地方多

优点

  • 简单粗暴
  • 对于结构好的项目,可以在BaseActivity下一并全部设置完成
相关推荐
毕设源码-邱学长34 分钟前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
兑生2 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu2 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
xiangpanf3 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
零雲4 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
robotx6 小时前
安卓线程相关
android
左左右右左右摇晃6 小时前
Java并发——synchronized锁
java·开发语言
消失的旧时光-19437 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
sxlishaobin7 小时前
Java I/O 模型详解:BIO、NIO、AIO
java·开发语言·nio
彭于晏Yan7 小时前
Spring AI(二):入门使用
java·spring boot·spring·ai