setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)不起作用

Tim*_*mmm 9 android android-layout android-fullscreen

我一直在与setSystemUiVisibility()斗争,试图隐藏一段时间的软导航按钮(对于视频播放器).它似乎不像宣传的那样工作.这是我的代码,在可见的内部FrameLayout.

void setNavVisibility(boolean visible)
{
    int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
    if (!visible)
    {
        newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    }
    setSystemUiVisibility(newVis);
}
Run Code Online (Sandbox Code Playgroud)

从SDK示例稍加修改:

    void setNavVisibility(boolean visible) {
        int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | SYSTEM_UI_FLAG_LAYOUT_STABLE;
        if (!visible) {
            newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
                    | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
        }
Run Code Online (Sandbox Code Playgroud)

打电话时也不做任何事.当我从另一个人那里打电话给我时,我取得了一些成功View,但是文档没有提到View你的来电有什么影响?我认为文档(惊喜)在这里有点缺乏.有谁知道真正发生了什么?

Tim*_*mmm 26

嗯显然我复制了我自己的问题!但无论如何我找到了答案:在阅读了源代码 - 这通常是在Android-land中找到问题的唯一方法之后 - 我发现了以下未记录的事实:

setSystemUiVisibility()仅在您调用它的视图可见时才有效!

更多:您调用setSystemUiVisibility()的视图必须保持可见,导航栏才能保持隐藏状态.感谢您记录这些家伙,非常棒.

这是相关的代码View.java.

void performCollectViewAttributes(AttachInfo attachInfo, int visibility) {
    if ((visibility & VISIBILITY_MASK) == VISIBLE) {
        if ((mViewFlags & KEEP_SCREEN_ON) == KEEP_SCREEN_ON) {
            attachInfo.mKeepScreenOn = true;
        }
        attachInfo.mSystemUiVisibility |= mSystemUiVisibility;
        ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnSystemUiVisibilityChangeListener != null) {
            attachInfo.mHasSystemUiListeners = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dur*_*son 5

我使用setOnSystemUiVisibilityChangeListener()使这个全屏模式适用于我,包括隐藏导航栏.

@Override
protected void onResume() {
    if (Build.VERSION.SDK_INT >= 16) {
        getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
                new OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                            getActionBar().show();
                        } else {
                            int mUIFlag = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                    | View.SYSTEM_UI_FLAG_LOW_PROFILE
                                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
                            getWindow().getDecorView()
                                    .setSystemUiVisibility(mUIFlag);
                            getActionBar().hide();
                        }
                    }
                });
    }

    super.onResume();
}
Run Code Online (Sandbox Code Playgroud)

似乎android只在侦听器内部触发setSystemUiVisibility().


Gol*_*hay 5

我如下实现了这个但是我在底部有一个空白(见截图)

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            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_LOW_PROFILE
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
                            | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 您可能应该将此作为另一个问题而不是答案(事实并非如此)发布。 (3认同)