Как сохранить пространство статус-бара? (Андроид 15+)

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
}
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено: Похоже, есть способ временно отказаться от этого. Не рекомендуется, но он есть

Использование флага 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 почему-то не работает, второе решение работает отлично, спасибо.

aj3423 05.08.2024 14:20

Также обновлено третье решение.

gtxtreme 06.08.2024 02:33

С помощью решения setOnApplyWindowInsetsListener, когда отступы изменяются, строка состояния становится непрозрачной. Можно ли сохранить отступы и сделать строку состояния прозрачной?

aj3423 06.08.2024 15:05

Нет, я думаю, это стандартное поведение Android 15.

gtxtreme 06.08.2024 15:15

Другие вопросы по теме