我想扩展有关在Android Ice Cream Sandwich(4.0及以上)平板电脑设备上屏幕底部隐藏系统/导航栏的讨论。
已经有一个关于隐藏Honeycomb设备上的栏的线程(Is there a way to hide the system bar in Android 3.0? It's an internal device and I'm managing navigation)。然而,我的客户将使用最新的冰淇淋三明治设备,并且非常热衷于隐藏屏幕底部的条形图。他们的应用程序不适合日常消费者使用,因此他们接管整个屏幕以提供他们的体验非常重要。如何在没有设备生根或重写固件的情况下隐藏此栏 - 或者至少覆盖所有按钮的行为?
答案 0 :(得分:24)
签出SYSTEM_UI_FLAG_HIDE_NAVIGATION
,此标志隐藏导航栏,直到用户与设备进行交互。它是在Android 4.0中引入的。您可以启用此标志,例如:
getWindow().getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
请注意,导航不会再自动消失,您必须在用户与设备交互后每次设置。
或者,您可以使用SYSTEM_UI_FLAG_LOW_PROFILE
使导航不那么突兀,这会将按钮更改为小点(例如相机应用程序)。
答案 1 :(得分:12)
在root设备上,我使用以下adb命令
adb shell pm disable com.android.systemui
永久隐藏导航栏。要再次显示,请运行
adb shell pm enable com.android.systemui
到目前为止它对我来说还不错
答案 2 :(得分:4)
使用以下代码是隐藏导航的一种方法
getWindow().getDecorView()
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
但上述问题是,只要用户触摸屏幕,它就会变得可见。
在Android Kitkat中有一个名为IMMERSIVE
的功能,它隐藏了通知栏和导航。即使用户与屏幕交互,它也不会显示。但是,用户可以通过从屏幕顶部向底部滑动来使其可见。以下是实现它的代码
//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()
。我知道这不是最好的方式。但我没有得到任何其他解决办法。
如果有人得到任何信息,请告诉我如何永久隐藏导航和通知栏:)希望这个答案有助于将来的某些人:)
观看this视频,以便更好地了解此功能。
答案 3 :(得分:3)
更新 - 有一种可用于此类情况的工作(为客户端手动设置应用程序)。实际上,导航栏无法在给定框架内删除。
但是,有一个解决方案可以隐藏导航栏,如果您为该设备生根。方法如下:
在HideBar中有一个选项可以在“Kiosk”模式下运行,在该模式下无法重新显示导航栏。不用说,你真的需要小心这一点。
涉及的风险:
砖砌设备
使BusyBox的安装错误,这可能会让事情变得有点棘手,尽管不太可能导致信息丢失。
陷入僵局,你无法退出你的应用程序。例如,如果1你的GUI没有提供关闭选项,2你的应用程序在启动时自动启动,3 HideBar不允许任何方式重新显示导航栏,4 HideBar在启动时隐藏导航栏。只需从adb停止/卸载您的应用即可克服此问题。
以下是其他相同的问题:
答案 4 :(得分:2)
虽然这是一个hacky解决方案,我认为它值得关注,因为不需要root设备:
getWindow().getDecorView().setSystemUiVisibility(8);
。
答案 5 :(得分:1)
要在android ics中隐藏状态栏和导航栏,请使用
LinearLayout layout = (LinearLayout)findViewById(R.id.layout);
layout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
答案 6 :(得分: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 os代码,启动eclipse调试器并进入a-huntin。这不是错误 - 导航栏对应用程序生命周期至关重要。
我见过应用程序(游戏等),所以有一种方法没有生根。
答案 7 :(得分:0)
将此代码放在清单文件的应用程序标记中,以隐藏默认标签栏
<Application
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" <!--
other parameters of application tag-->
>
然后制作线性或相对布局并将其放置在您的活动布局中。
答案 8 :(得分:0)
除非您已根设备,否则无法隐藏它。但是当然有一种解决方法可能不符合您的要求,但目前市场上的几个知名应用程序使用此策略来实现其应用程序的禁用菜单栏功能。
答案 9 :(得分:0)
可能是按钮行为已足够您可以查看我的回答here
你仍然有吧但你不能在没有重启平板电脑的情况下退出应用程序
答案 10 :(得分:0)
您可以使用SYSTEM_UI_FLAG_HIDE_NAVIGATION标志隐藏Android 4.0及更高版本上的导航栏。此代码段隐藏了导航栏和状态栏:
View decorView = getWindow().getDecorView();
// Hide both the navigation bar and the status bar.
// SYSTEM_UI_FLAG_FULLSCREEN is only available on Android 4.1 and higher, but as
// a general rule, you should design your app to hide the status bar whenever you
// hide the navigation bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions
请参阅以下内容:Hiding the Navigation Bar
答案 11 :(得分:-2)
如果您的设备已植根,此代码将帮助您隐藏ICS上的系统栏(我在三星Galaxy Tab 2上进行了测试,效果非常好):
ArrayList<String> list = new ArrayList<String>();
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
list.add(envName + "=" + env.get(envName));
}
// Array containing the environment to start the new process in
String[] envp = (String[]) list.toArray(new String[0]);
String hidingCommand = "while [ true ]\n" + "do\n" + "killall com.android.systemui\n" + "done\n";
Runtime.getRuntime().exec(new String[] { "su", "-c", command }, envp);
myContext.sendBroadcast(new Intent("com.mycompany.myapp.ACTION_BARHIDDEN"));