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)
我使用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().
我如下实现了这个但是我在底部有一个空白(见截图)
@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)