Android 关于状态栏的内容:开启沉浸式页面内容被状态栏遮盖;状态栏暗亮色设置;

目录

  1. 沉浸式,内容陷入到了状态栏里面怎么办?
  2. 状态栏暗亮色设置

一、沉浸式,内容陷入到了状态栏里面

比如下面的一个问题

如果不开启沉浸式,就是下面这个效果

当我们调用了

kt 复制代码
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    enableEdgeToEdge()
    ....
 }

那么就是开启了沉浸式。也就是内容会扩展到状态栏里面。但我们只想背景融入进去,而不想内容也融入到里面。那么可以调用下面这个代码。

java 复制代码
/**
 * Add the top margin size equals status bar's height for view.
 *
 * @param view The view.
 */
public static void addMarginTopEqualStatusBarHeight(@NonNull View view) {

    view.setTag(TAG_OFFSET);// 为视图设置一个标记(如 "status_bar_offset")
    Object haveSetOffset = view.getTag(KEY_OFFSET);// 检查是否已处理过
    if (haveSetOffset != null && (Boolean) haveSetOffset) return;// 已处理则直接返回
    MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();//获取视图的布局参数
    //增加上边距
    layoutParams.setMargins(layoutParams.leftMargin,
            layoutParams.topMargin + getStatusBarHeight(),// 关键:原上边距 + 状态栏高度,getStatusBarHeight():获取系统状态栏高度
            layoutParams.rightMargin,
            layoutParams.bottomMargin);
    view.setTag(KEY_OFFSET, true); // 标记为已处理
}

/**
 * Return the status bar's height.
 *
 * @return the status bar's height
 */
public static int getStatusBarHeight() {
    Resources resources = Resources.getSystem();
    int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
    return resources.getDimensionPixelSize(resourceId); // 返回状态栏高度(像素)
}

使用

kt 复制代码
override fun initListener() {
    BarUtils.addMarginTopEqualStatusBarHeight(binding.noise)
    lifecycleScope.launch {
        NoiseMeter.noiseLevelFlow
            .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
            .collect { noiseData ->
                binding.noise.text = noiseData.toString()
            }

    }
}

通过​​动态增加视图的上边距(等于状态栏高度)​ ​,解决了沉浸式模式下内容被状态栏遮挡的问题,同时利用 Tag机制确保逻辑只执行一次,是一种简单有效的兼容性方案。

1.1 官方推荐的方案

还有官方推荐的方式:

kt 复制代码
fun View.addMarginTopEqualStatusBarHeight(){
    ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
        val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
        view.updatePadding(top = systemBars.top) // 顶部避开状态栏
        insets // 返回原始的 WindowInsetsCompat 对象
    }
}

调用

scss 复制代码
binding.noise.addMarginTopEqualStatusBarHeight()

导航栏其实也有可能存在遮挡,可以如下这样。

kt 复制代码
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
    val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
    view.updatePadding(
        top = systemBars.top,
        bottom = systemBars.bottom // 底部避开导航栏
    )
    insets
}

二、状态栏暗亮色设置

kt 复制代码
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    WindowCompat.getInsetsController(
        window,
        window.decorView
    ).isAppearanceLightStatusBars = isStatusBarLight()
 }
 

open fun isStatusBarLight(): Boolean {
    return true 
}

true就是暗色,false就是亮色,如果你有不同页面使用不同的颜色,就可以重写这个方法,就可以了。

相关推荐
阿巴斯甜4 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker5 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95276 小时前
Andorid Google 登录接入文档
android
黄林晴7 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab20 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android