目录
- 沉浸式,内容陷入到了状态栏里面怎么办?
- 状态栏暗亮色设置
一、沉浸式,内容陷入到了状态栏里面
比如下面的一个问题

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

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