如何在Android活动中永久隐藏导航栏?
我想隐藏导航栏永久在我的活动(不是整个系统UI)。 现在我正在使用这段代码
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
它隐藏了栏,但用户触摸屏幕时,再次显示。 是否有任何方法永久隐藏,直到活动onStop()
;
摘录:
FullScreenFragment.java
HideNavigationBarComponent.java
这是为Android 4.4以上
试用身临其境的模式https://developer.android.com/training/system-ui/immersive.html
快速片段(对于Activity类):
private int currentApiVersion; @Override @SuppressLint("NewApi") protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); currentApiVersion = android.os.Build.VERSION.SDK_INT; final int flags = 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; // This work only for android 4.4+ if(currentApiVersion >= Build.VERSION_CODES.KITKAT) { getWindow().getDecorView().setSystemUiVisibility(flags); // Code below is to handle presses of Volume up or Volume down. // Without this, after pressing volume buttons, the navigation bar will // show up and won't hide final View decorView = getWindow().getDecorView(); decorView .setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { decorView.setSystemUiVisibility(flags); } } }); } } @SuppressLint("NewApi") @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(currentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus) { 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); } }
如果在按导航条显示的“音量提高”或“音量降低”时遇到问题。 我在onCreate
添加了代码,请参阅setOnSystemUiVisibilityChangeListener
这是另一个相关的问题:
在音量按下或最小化恢复之后,身临其境的模式导航变得粘滞
做这个。
public void FullScreencall() { if(Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); v.setSystemUiVisibility(View.GONE); } else if(Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; decorView.setSystemUiVisibility(uiOptions); } }
这工作100%,你可以做相同的低API版本,即使这是一个迟到的答案,我希望它可以帮助别人。
使用:-
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
在运行Android 4+的平板电脑中,无法隐藏系统/导航栏。
从文档 :
SYSTEM_UI_FLAG_HIDE_NAVIGATION是一个新的标志,要求导航栏完全隐藏。 请注意,这只适用于某些手机使用的导航栏(它不会隐藏平板电脑上的系统栏)。
根据Android开发者网站
我认为你不能(据我所知)永久隐藏导航栏..
但是,你可以做一个把戏。 它是一个狡猾的头脑。
就在用户触摸屏幕时navigation bar
出现的时候。 立即再次隐藏它。 好有趣。
检查这个 。
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; } // If we are now visible, schedule a timer for us to go invisible. if (visible) { Handler h = getHandler(); if (h != null) { h.removeCallbacks(mNavHider); if (!mMenusOpen && !mPaused) { // If the menus are open or play is paused, we will not auto-hide. h.postDelayed(mNavHider, 1500); } } } // Set the new desired visibility. setSystemUiVisibility(newVis); mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE); mPlayButton.setVisibility(visible ? VISIBLE : INVISIBLE); mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE); }
看到这个更多的信息在这..
隐藏平板电脑中的系统栏
它的一个安全问题: https : //stackoverflow.com/a/12605313/1303691
因此无法在视图创build开始时通过一次呼叫将导航永久隐藏在平板电脑上。 它将被隐藏,但在触摸屏幕时会popup。 所以,只要你的屏幕上的第二个触摸可以导致您的布局onClickEvent
。 因此,你需要拦截这个电话,但是我还没有pipe理它,当我发现它的时候,我会更新我的答案。 或者你现在已经有了答案吗?
尝试这个。
View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions);
让我知道如果这有帮助… 🙂
我认为打击代码将帮助你,并添加setContentView()之前的代码
getWindow().setFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
将这些代码添加到setContentView()getWindow()。getDecorView()。setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
这是我的解决scheme:
首先,定义指示导航栏是否可见的布尔值。
boolean navigationBarVisibility = true //because it's visible when activity is created
其次创build隐藏导航栏的方法。
private void setNavigationBarVisibility(boolean visibility){ if(visibility){ View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); navigationBarVisibility = false; } else navigationBarVisibility = true; }
默认情况下,如果您在隐藏导航栏后点击活动,导航栏将会显示。 所以我们得到它的状态,如果它可见,我们将隐藏它。
现在将OnClickListener设置为您的视图。 我使用一个surfaceview,所以对我来说:
playerSurface.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setNavigationBarVisibility(navigationBarVisibility); } });
另外,当活动启动时,我们必须调用这个方法。 因为我们想在开始的时候隐藏它。
setNavigationBarVisibility(navigationBarVisibility);