Android 15 предлагает использовать enableEdgeToEdge()
, но при этом убирается верхнее смещение строки состояния, в результате чего основной контент перекрывается с ним.
Как лучше всего сохранить высоту строки состояния? Просто оставьте его прозрачным и визуализируйте содержимое под ним.
Это моя попытка, она работает, но много кода, есть ли более простой способ?
// in the MainActivity.onCreate():
enableEdgeToEdge()
// the callback will be invoked repeatedly, use this flag to only set the margin-top once
var offsetAdjusted = false
window.decorView.setOnApplyWindowInsetsListener { _, insets ->
if (!offsetAdjusted) {
offsetAdjusted = true
val top = if (Build.VERSION.SDK_INT > Def.ANDROID_10) // for android > 10
insets.getInsetsIgnoringVisibility(WindowInsets.Type.statusBars()).top
else // for android 10
view.rootWindowInsets.stableInsetTop
// the fragment container, which is a FragmentContainerView
val container = binding.root.findViewById<FragmentContainerView>(R.id.nav_host_fragment_activity_main)
val params = container.layoutParams as ViewGroup.MarginLayoutParams
params.topMargin = top
container.layoutParams = params
}
insets
}
Обновлено: Похоже, есть способ временно отказаться от этого. Не рекомендуется, но он есть
Использование флага windowOptOutEdgeToEdgeEnforcement
, который может быть true/false
Описание можно найти здесь
Есть много способов сделать это
Существует флаг fitsSystemWindows
, который можно установить на true
в вашем AndroidManifest.xml
, если вы ориентируетесь только на строку состояния (ту, что вверху). Смотрите здесь
Другой подход, очень похожий на тот, который вы использовали, — использование setOnApplyWindowInsetsListener
Вы также можете вернуть WindowInsetsCompat.CONSUMED
, если используете его, чтобы он не запускал код повторно.
ViewCompat.setOnApplyWindowInsetsListener(binding.recyclerView) { v, insets ->
val bars = insets.getInsets(
WindowInsetsCompat.Type.systemBars()
or WindowInsetsCompat.Type.displayCutout()
)
v.updatePadding(
left = bars.left,
top = bars.top,
right = bars.right,
bottom = bars.bottom,
)
WindowInsetsCompat.CONSUMED
}
Вы также можете дать раздел здесь прочитать один раз. Надеюсь это поможет
Также обновлено третье решение.
С помощью решения setOnApplyWindowInsetsListener
, когда отступы изменяются, строка состояния становится непрозрачной. Можно ли сохранить отступы и сделать строку состояния прозрачной?
Нет, я думаю, это стандартное поведение Android 15.
setOnApplyWindowInsetsListener
почему-то не работает, второе решение работает отлично, спасибо.