关于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下一并全部设置完成
相关推荐
Che2n3JigW1 天前
Now in Android:它不是最佳实践,而是大型 Android 工程实践的展示
android·architecture·now in android
故渊at1 天前
第三板块:Android 图形渲染与窗口体系 | 第十三篇:SurfaceFlinger 与 VSYNC 信号机制
android·图形渲染·surfaceflinger·帧率·窗口体系
Chase_______1 天前
【Java杂项】Arrays.asList、List.of 和 new ArrayList:集合可变性避坑
java·windows·list
发际线向北1 天前
0x07 深入了解JVM虚拟机(JVM异常处理)
java
Seven971 天前
每个线程只管自己的变量,性能却不如单线程?问题出在缓存行
java
Che2n3JigW1 天前
Now in Android Feature 模块分析:一个功能是如何被组织起来的?
android·udf·architecture·now in android·modularization·feature module
2601_961845151 天前
2026四级作文预测题|英语四级写作押题+提纲PDF
java·c语言·数据库·c++·python·pdf·php
Che2n3JigW1 天前
Now in Android 项目结构分析:这个 App 是如何搭建起来的?
android·architecture·now in android·modularization·structure
用户531397318171 天前
「踩坑实录」原来的SQL索引自动优化失败了,线上数据库差点被打挂
java·后端
SimonKing1 天前
线程池面试被问到怕?看完这篇让他当场沉默
java·后端·程序员