当状态栏被隐藏时,有没有办法阻止 "jumping" 的布局?
Is there a way to prevent a layout from "jumping" when the status bar is being hidden?
我正在尝试使用视图寻呼机在我的应用程序中实现照片查看器。我能够让系统 UI 消失(包括导航栏和状态栏)。我遇到的唯一问题是每次我使状态栏消失并重新出现时,我在视图寻呼机上的布局开始摇晃或跳跃。
我已经尝试按照 堆栈溢出 post 中的建议设置系统 ui 标志。但它仍然给我 "jumpy" 布局响应。
下面的代码是我用来hide/show状态栏的:
/**
* 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_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>
所以我在一个新项目上进行了实施,并在我的模拟器(Pixel 2 XL 和 Pixel 3 XL)中的两个不同设备上进行了尝试。我注意到它通常会隐藏在像素 2 下,但在像素 3 xl(带有缺口)上,它会在缺口本身下方绘制。
经过一番搜索,我意识到我必须弄乱 display cutout(也称为缺口)并设置一个标志来告诉系统 ui 在缺口本身下方绘制。
这很有效,希望下面的代码能帮助看到它的任何人。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}
我正在尝试使用视图寻呼机在我的应用程序中实现照片查看器。我能够让系统 UI 消失(包括导航栏和状态栏)。我遇到的唯一问题是每次我使状态栏消失并重新出现时,我在视图寻呼机上的布局开始摇晃或跳跃。
我已经尝试按照
下面的代码是我用来hide/show状态栏的:
/**
* 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_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>
所以我在一个新项目上进行了实施,并在我的模拟器(Pixel 2 XL 和 Pixel 3 XL)中的两个不同设备上进行了尝试。我注意到它通常会隐藏在像素 2 下,但在像素 3 xl(带有缺口)上,它会在缺口本身下方绘制。
经过一番搜索,我意识到我必须弄乱 display cutout(也称为缺口)并设置一个标志来告诉系统 ui 在缺口本身下方绘制。
这很有效,希望下面的代码能帮助看到它的任何人。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}