如何在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);