有没有办法在状态栏隐藏时防止布局“跳跃”?

ant*_*der 5 xml android android-viewpager kotlin windowinsets

我正在尝试使用视图寻呼机在我的应用程序中实现照片查看器。我可以通过一次触摸让系统 UI(导航栏和状态栏)消失。我遇到的唯一问题是,每次我使状态栏消失并重新出现时,我的视图寻呼机上的布局就会开始晃动或跳跃。

我的实施的视觉效果

我正在尝试实现什么

我尝试按照stack over flow 帖子中的建议设置系统 ui 标志。但它仍然给我“跳跃”的布局响应。

下面的代码是我用来隐藏/显示状态栏的代码:

/**
 * Hide status bar and navigation bar.
 */
private fun hideSysWindows(activity: Window) {
    activity.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)
}

/**
 * Show status bar and navigation bar.
 */
private fun showSysWindows(activity: Window) {
    activity.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
}
Run Code Online (Sandbox Code Playgroud)

我的视图寻呼机的 XML 代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@color/black">

    <com.example.snapkit.mediaviewer.MediaViewPager android:layout_width="match_parent"
                                                    android:layout_height="match_parent"
                                                    android:id="@+id/media_viewer"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

ant*_*der 4

因此,我在一个新项目上进行了实现,并在模拟器中的两个不同设备上进行了尝试(Pixel 2 XL 和 Pixel 3 XL)。我注意到,它通常会隐藏在像素 2 下方,但在像素 3 xl(带有凹口)上,它将在凹口本身下方绘制。

经过一番搜索后,我意识到我必须弄乱显示切口(也称为凹口)并设置一个标志来告诉系统用户界面在凹口本身下方绘制。

这就像一个魅力,希望下面的代码能够帮助任何看到这个的人。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
        window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    }
Run Code Online (Sandbox Code Playgroud)