Полноэкранный иммерсивный режим без отскока макета - PullRequest
3 голосов
/ 19 марта 2020

Как можно переключаться между иммерсивным режимом и режимом без погружения без перерасчета макета и таким образом испытывать эффект отскока? Вот соответствующий код, который я использую для переключения между состояниями:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        immersive_btn.setOnClickListener {
            toggleImmersive()
        }
    }
    val isInFullScreenImmersiveMode: Boolean
        get() = window!!.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_IMMERSIVE == View.SYSTEM_UI_FLAG_IMMERSIVE

    private fun toggleImmersive() {
        if (isInFullScreenImmersiveMode) {
            showSystemBar()
        } else {
            setFullScreenImmersiveMode()
        }
    }

    fun showSystemBar() {
        window!!.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
    }

    fun setFullScreenImmersiveMode() {
        window!!.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_FULLSCREEN
                or View.SYSTEM_UI_FLAG_IMMERSIVE)
    }

Видео, показывающее отскок: enter image description here

Единственное решение, которое я нашел with использует window?.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) в OnCreate(), но это может привести к другой проблеме: строка состояния не будет отображаться, даже если она не находится в полноэкранном режиме с погружением.

Редактировать: файл макета:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/immersive_btn"
        android:layout_centerInParent="true"
        android:layout_centerHorizontal="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Toggle Immersive" />

</RelativeLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...