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

Posted

技术标签:

【中文标题】当隐藏状态栏时,有没有办法防止布局“跳跃”?【英文标题】:Is there a way to prevent a layout from "jumping" when the status bar is being hidden? 【发布时间】:2020-01-04 14:58:59 【问题描述】:

我正在尝试使用视图寻呼机在我的应用中实现照片查看器。只需轻轻一按,我就能让系统 UI 消失(导航栏和状态栏)。我遇到的唯一问题是,每当我让状态栏消失并重新出现时,我的视图寻呼机上的布局就会开始抖动或跳跃。

A visual of my implementation

What I'm trying to implement

我已尝试按照this stack over flow post 中的建议设置系统 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)

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

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

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

</LinearLayout>

【问题讨论】:

您是否尝试过在片段根目录中使用 android:animateLayoutChanges="true" 或在 Viewpager 中使用 LinearLayout?,指向您的 gif 文件的链接,不要与我一起使用。 对不起。让我更新 gifs @Racu 我已经更新了 gif,我还尝试将属性添加到我的根视图和线性布局,但是当我尝试隐藏状态栏时它仍然在跳跃。 啊,用 gif 更好,试试android:fitSystemWindows="false" 嗯,结果还是一样,但我注意到我的布局现在从顶部向下推的距离几乎与状态栏的高度相同。 【参考方案1】:

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

经过一番搜索,我意识到我必须弄乱display cutout(也称为缺口)并设置一个标志来告诉系统用户界面在缺口下进行绘制。

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
        window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    

【讨论】:

以上是关于当隐藏状态栏时,有没有办法防止布局“跳跃”?的主要内容,如果未能解决你的问题,请参考以下文章

iOS7隐藏状态栏但不调整顶部布局指南

隐藏导航栏时的假状态栏颜色

我在屏幕上放置了一个带有自动布局的 UILabel,但是当我隐藏导航栏时,它会导致标签“抽搐”一秒钟 [重复]

隐藏状态栏时,iOS 11 搜索栏没有顶部填充

iOS 7隐藏导航栏时如何更改状态栏的颜色?

在iOS 7中隐藏导航栏时,如何更改状态栏的颜色?