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就是亮色,如果你有不同页面使用不同的颜色,就可以重写这个方法,就可以了。

相关推荐
黑码哥6 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓6 小时前
[JDBC]元数据
android
独行soc6 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能6 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿6 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc7 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20357 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106327 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview
vistaup8 小时前
OKHTTP 默认构建包含 android 4.4 的TLS 1.2 以及设备时间不对兼容
android·okhttp
常利兵8 小时前
ButterKnife在Android 35 + Gradle 8.+环境下的适配困境与现代化迁移指南
android