关于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下一并全部设置完成
相关推荐
漠缠1 天前
Android AI客户端开发(语音与大模型部署)面试题大全
android·人工智能
小wanga1 天前
C++知识
java·开发语言·c++
Lei活在当下1 天前
一个基础问题:关于SDK初始化时机的选择
android
我是渣哥1 天前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化
工一木子1 天前
深入Java并发:锁机制原理剖析与性能优化实战
java·性能优化·并发·
你我约定有三1 天前
java--写在 try 中的创建连接
java·开发语言
ERP老兵-冷溪虎山1 天前
Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
java·javascript·python·golang·中医编程·四语言同步学习·职场生存指南
科技树支点1 天前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器
码农小伙1 天前
ConcurrentHashMap解析
java·开发语言
WhiteJunior1 天前
Java基础知识点汇总(五)
java·开发语言