屏幕下方的Android关闭全屏视图

时间:2018-01-11 19:13:25

标签: android fullscreen toolbar

我有一个屏幕,底部工具栏使用以下样式对齐

<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>

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

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

enter image description here

如果我对我的应用程序进行后台操作然后将其前置,则可以正确呈现底部工具栏。

我在屏幕顶部有一个栏(而不是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 - 视图未被推到底部,其高度太小

看起来底部视图没有从屏幕底部推开,它的高度缩小并且小于应有的高度。

底部视图是一个LinearLayout,其高度设置为“wrap_content”,但看起来高度未正确计算,因为它的内容比其内容短,因此其内容的底部被截断。

编辑3 - 问题出现的设备

进一步调查显示该问题仅出现在没有屏幕导航栏的设备上。例如问题出在我的三星10英寸平板电脑上,但不在我的Nexus 5x上。

3 个答案:

答案 0 :(得分:1)

如果我删除以下标记,问题似乎已修复

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 :(得分:1)

我遇到同样的问题。我也搜索了谷歌,但没有得到解决方案。 我在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);

答案 2 :(得分:0)

我的问题

  1. 我从全屏活动转到黑暗行动主题活动。
  2. 我按下了软键盘上的“后退”按钮以返回全屏活动。

底部的视图突然被切断。

我通过覆盖onBackPressed()方法并重新启动我的活动来解决此问题:

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

这应该重新创建活动。如果可以的话,这是一个很好的技巧。