Android ICS中有没有隐藏系统/导航栏的方法?

21

我想进一步讨论如何在安卓冰淇淋三明治(4.0及以上)平板设备上隐藏屏幕底部的系统/导航栏。

已经有一个主题 (Is there a way to hide the system bar in Android 3.0? It's an internal device and I'm managing navigation) 关于如何在Honeycomb设备上隐藏该栏。然而,我的客户将使用最新的Ice Cream Sandwich设备,并非常渴望隐藏屏幕底部的该栏。他们的应用程序并不是为普通消费者使用,非常重要的是他们需要占据整个屏幕以提供完整的用户体验。那么在不进行root或重写固件的情况下,是否有可能隐藏这个栏 - 或者至少覆盖所有按钮的行为呢?


1
可能是重复的问题有没有办法在Android 3.0中隐藏系统栏?这是一个内部设备,我正在管理导航 - Honeycomb的答案对ICS仍然有效。 - WarrenFaith
1
看起来Honeycomb和ICS在系统栏方面存在重大差异。请参考http://android.serverbox.ch/?p=306,尤其是2011年12月29日17:20的回复。 - user316117
他指的是4.0及以上版本。自从4.4以来,谷歌的VR努力已经引发了一种新的模式。 请参见下面关于沉浸式模式的评论。 https://developer.android.com/training/system-ui/immersive.html - Dominic Cerisano
12个回答

24

请查看SYSTEM_UI_FLAG_HIDE_NAVIGATION,该标志会隐藏导航栏,直到用户与设备进行交互。它是在Android 4.0中引入的。您可以像这样启用此标志:

getWindow().getDecorView()
           .setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

请注意,导航栏不会再自动消失,您需要在用户与设备交互后每次设置它。
另外,您可以使用SYSTEM_UI_FLAG_LOW_PROFILE使导航栏变得不那么突兀,将按钮更改为小圆点(例如,像相机应用程序一样)。

1
我们已经尝试过了。Ice Cream Sandwich版本的ApiDemos有一个屏幕,可以循环显示不同的SystemUiVisibility选项。当我们尝试使用SYSTEM_UI_FLAG_HIDE_NAVIGATION时没有任何反应。您认为这种行为可能与设备有关吗?我们在华硕Transformer Prime上进行了尝试。 - Rob Szumlakowski
我刚刚在模拟器中尝试了一下,它按照描述正常工作。目前我只有一部带有硬件键的旧HTC Desire手机,所以无法在真实设备上测试。可能与设备有关,不能确定。 - user658042
可以正常工作,但是根据文档,“有一个限制:由于导航控件非常重要,最少的用户交互将会立即导致它们重新出现。”也就是说,只要用户触摸屏幕,它们就会弹回来。 - weston
你也可以更改你的SDK版本,例如:<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17"/>,这样它就不会显示了。 - Daryn

13

在已取得root权限的设备上,我使用以下adb命令

adb shell pm disable com.android.systemui

永久隐藏导航栏。要再次显示它,请运行

adb shell pm enable com.android.systemui

目前对我来说它运行良好。


当我运行此禁用命令时,设备会重新启动。你有这种问题吗? - Dallas187
是的,它可以 :) 重启后,它能正常工作,直到你再次启用SystemUI(设备也会再次重启)。 - Nartus Team
7
感谢您的反馈。重启真的很麻烦,所以我正在使用以下命令来隐藏栏 adb shell service call activity 42 s16 com.android.systemui,然后执行以下命令来显示栏: adb shell am startservice -n com.android.systemui/.SystemUIService。这种方法不需要重启,我想与你分享,以防你也喜欢它。 - Dallas187
是的,我会 :) 谢谢分享。 - Nartus Team
1
如果您也对壁纸消失感到不满意,我也成功修复了这个问题。请查看此SO帖子 - Dallas187
显示剩余5条评论

5
使用以下代码是隐藏导航栏的一种方法。
getWindow().getDecorView()
           .setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

但是上述方法的问题在于,一旦用户触摸屏幕,它就会变得可见。

在Android Kitkat中,有一个名为“沉浸式”的功能,它可以隐藏通知栏和导航栏。即使用户与屏幕进行交互,它也不会显示出来。但是用户可以通过从屏幕顶部向下滑动来使其可见。以下是实现它的代码:

//Initializew this in onCreate()
View mDecorView = getWindow().getDecorView();

//Then call this function
private void hideSystemUI() {
     mDecorView.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_LOW_PROFILE
            | View.SYSTEM_UI_FLAG_IMMERSIVE);
}

然而在我的情况下,即使用户从屏幕顶部向下滑动,我也不想让导航栏和通知栏可见。我尝试了一下,部分实现了这个功能。我实现了一个CountDownTimer,每秒钟调用hideSystemUI()函数。我知道这不是最好的方法,但我没有找到其他解决方案。
如果有人有更好的解决方案,请告诉我如何永久隐藏导航栏和通知栏 :) 希望这个答案能帮助未来的某些人 :)
观看这个视频以更好地了解这个功能。

3
更新 - 有一个解决方法可用于这种情况(手动为客户端设置应用程序)。实际上,在给定的框架内无法删除导航栏。
然而,如果您可以对设备进行root操作,则有一种方法可以隐藏导航栏。方法如下: Root设备 安装并运行Busybox 安装HideBar 在HideBar中,有一个选项可以运行在“Kiosk”模式下,在此模式下,没有重新显示导航栏的方法。不用说,您确实需要小心处理。
涉及的风险:
  • 变砖设备

  • 安装BusyBox出错,这可能会使事情变得有点棘手,但极不可能导致信息丢失。

  • 陷入僵局,无法退出应用程序。例如,如果1您的GUI没有提供关闭选项,2您的应用程序在启动时自动启动,3 HideBar不允许重新显示导航栏的任何方法,以及4 HideBar在启动时隐藏导航栏。但是,只需通过adb停止/卸载您的应用程序即可克服此问题。

以下是其他相同的问题:


我想确认非root的ICS平板确实不可能做到。市场上对于非root的ICS平板,是否真的没有真正的全屏应用程序(不是由经销商提供的默认应用程序,他们可以使用自定义固件来实现目的,我需要一般的应用程序)?如果真的有这样一个应用程序,请告诉我。 - Yeung
@神猫,我认为非root的ICS平板电脑最著名的应用程序是“SureLock”:http://www.42gears.com/surelock/ 它有一个免费版本,但有一些限制。如果你尝试过,请分享一下你是否成功使用了它? - ılǝ
2
"SureLock"有两个选项。 "禁用底部栏"和"隐藏底部栏"。请参见链接。 "禁用"不需要root权限,但是栏仍然存在。它只是使触摸栏不起作用。而对于"隐藏",则需要root权限。 - Yeung
@神猫,所以你看到了 - 即使是最受欢迎的应用程序也无法隐藏该栏。我敢打赌,如果没有root权限,这是不可能的。 - ılǝ

2

虽然这是一个不太正规的解决方案,但我认为它值得关注,因为它不需要对设备进行root处理:getWindow().getDecorView().setSystemUiVisibility(8);


对不起,我认为它不能在所有平板电脑上运行。我已经看到有些平板电脑使用自定义固件可以通过类似的方法隐藏栏,但这并不普遍。 - Yeung

1

更新:从4.4(19)版本开始,您可以使用以下方法启用所谓的“IMMERSIVE MODE”。它是为Google的Cardboard vrtoolkit引入的,但可以通用使用。

setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE)

https://developer.android.com/training/system-ui/immersive.html

从我的努力来看,似乎: setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) 在平板电脑上无法使用。
它可以在智能手机上使用(在 Nexus 4 Mako 上测试过),但触摸/点击事件会重新出现。 这也似乎捕获了对栏的焦点,强制您点击两次以恢复对视图的焦点。
我一直在尝试找到一种方法来捕获实际重新显示栏的事件。没有运气。
我很固执,我将下载Android操作系统代码,启动Eclipse调试器并去寻找。这不是一个错误 - 导航栏对应用程序生命周期至关重要。
我已经看到应用程序这样做(游戏等),所以有一种方法而不需要root。

这是哪个游戏?它在Play商店上有吗? - Yeung

1

在Android ICS中隐藏状态栏和导航栏,请使用以下方法:

LinearLayout layout = (LinearLayout)findViewById(R.id.layout);
layout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

1
我尝试了这个,但是它仍然不能隐藏导航栏。 - ılǝ

0

除非您已经对设备进行了 root,否则无法隐藏它。但是当然有一个解决方法,可能不符合您的要求,但目前市场上有几个知名应用程序使用此策略来为其应用程序实现此禁用菜单栏功能。

  • 授予管理权限。
  • 使用设备管理程序接口设置密码并锁定设备
  • 然后在本机锁定屏幕上加载任何 UI(当然,在活动之间发生过渡时,这将显示背景锁定屏幕。但如果逻辑组织得好,那么用户会感觉顺畅且不太引人注目)。
  • 需要启用时,请使用设备策略管理器对象的 resetPassword("", 0) 将密码重置为“”。

0

也许按钮的行为已经足够了,你可以在我的答案这里看一下

虽然你仍然有状态栏,但是你不能退出应用程序而不重新启动平板电脑。


0
将以下代码放置在清单文件中的应用标签中,以隐藏默认的选项卡栏。
<Application
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!--
other parameters of application tag-->
>

然后创建一个线性或相对布局,并将其放置在您的活动布局中。


1
实际上,这并没有移除导航栏,只是标题栏。 - medonja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接