Android关闭底部全屏视图被分流出屏幕

Android closing full screen view at the bottom is shunted off the screen

我的屏幕底部工具栏使用以下样式对齐

<style name="BottomToolbar" >
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:background">@color/WHITE</item>
    <item name="android:layout_gravity">bottom</item>
    <item name="android:layout_alignParentBottom">true</item>
    <item name="android:minHeight">?attr/actionBarSize</item>
</style>

当我第一次进入我的屏幕时,工具栏与屏幕底部很好地对齐。

但是,如果我进入全屏模式(隐藏工具栏)然后 return 进入正常模式(重新显示工具栏),工具栏现在会稍微离开屏幕。看起来好像它向下移动了在全屏模式下隐藏的状态栏的数量。

如果我将我的应用置于后台,然后将其置于前台,底部工具栏会正确呈现。

我在屏幕顶部有一个栏(而不是 appBar)并且呈现在正确的位置。我无法弄清楚为什么它会错放底部工具栏。

就好像在确定父级的底部时,它不再根据它不是全屏高度的事实进行调整。

我试过的

我试过在退出全屏模式时在我的工具栏上设置 "fitsSystemWindows="true"" 但这没有什么区别。

我试过在隐藏工具栏时将其设置为 INVISIBLE 而不是 GONE,但这没有什么区别。

编辑 1 - 添加了我如何进入和退出全屏的代码片段

我使用以下命令进入全屏

getActivity().getWindow().getDecorView().setSystemUiVisibility(
      View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    | View.SYSTEM_UI_FLAG_FULLSCREEN
    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

我使用以下代码退出全屏

getActivity().getWindow().getDecorView().setSystemUiVisibility(
    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

编辑 2 - View 没有被推离底部,它的高度太小

底部视图似乎没有从屏幕底部移开,它的高度缩小了,小于应有的高度。

底部视图是一个 LinearLayout,其高度设置为 "wrap_content",但似乎高度计算不正确,因为它比其内容短,因此其内容的底部被切断。

编辑 3 - 出现问题的设备

进一步调查表明,该问题仅出现在没有屏幕导航栏的设备上。例如,问题出在我的 Samsung 10" 平板电脑上,但出在我的 Nexus 5x 上。

如果我删除以下标志,问题似乎已得到解决

View.SYSTEM_UI_FLAG_LAYOUT_STABLE

此标志的 Google 文档是“当使用其他布局标志时,我们希望提供给 fitSystemWindows(Rect) 的内容插图的稳定视图。https://developer.android.com/reference/android/view/View.html

文档说 “您可能还需要使用 SYSTEM_UI_FLAG_LAYOUT_STABLE 来帮助您的应用保持稳定的布局。” (https://developer.android.com/training/system-ui/status.html) 和 “最好包含其他系统 UI 标志(例如 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_LAYOUT_STABLE),以防止内容在系统栏隐藏和显示时调整大小。" (https://developer.android.com/training/system-ui/immersive.html)

我的问题:

  1. 我从全屏 activity 退出到 Dark Action 主题 activity。
  2. 我按了软键盘上的后退按钮返回全屏 activity。

底部的视图突然被切断了。

通过覆盖onBackPressed()方法和重新启动解决了这个问题,我的Activity:

@Override
public void onBackPressed() {
    startActivity(new Intent(getApplicationContext(), YourActivityHere.class));
}

这应该会重新创建 activity。如果你能申请,这是一个很好的黑客。

我遇到了同样的问题。我还搜索了 google 但没有得到解决方案。 我在 onBackPressed() 上应用了 100 毫秒延迟,因为我使用了 setSystemUiVisibility 但它需要时间。

问题 - 片段在 setSystemUiVisibility 之前调用,因为 setSystemUiVisibility 需要时间,所以我们需要设置后退延迟。

    public static void hideToolbarFoProfile(Context mContext) {
        Activity mActivity = (Activity) mContext;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window w = Objects.requireNonNull(mActivity).getWindow();
            w.getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

        }

        ((MainActivity) Objects.requireNonNull(mActivity)).toolbar.setVisibility(View.GONE);

    }

    public static void showToolbarFoProfile(Context mContext) {
        Activity mActivity = (Activity) mContext;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window w = Objects.requireNonNull(mActivity).getWindow();
            w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                w.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            }
        }

        ((MainActivity) Objects.requireNonNull(mActivity)).toolbar.setVisibility(View.VISIBLE);

    }

new Handler().postDelayed(() -> {
                Objects.requireNonNull(getActivity()).onBackPressed();
            }, 100);