Как можно переключаться между иммерсивным режимом и режимом без погружения без перерасчета макета и таким образом испытывать эффект отскока? Вот соответствующий код, который я использую для переключения между состояниями:
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)
}
Видео, показывающее отскок:
Единственное решение, которое я нашел 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>