http://www.07net01.com/2015/04/822292.html

android4.0及其以上的版本中,出现了一个很屌的东西,叫做Navigation Bar,它和Status Bar

一上一下相互交映,影响了我们的全屏。如果还不知道Navigation Bar是个毛,请看下图:

1. 低级隐藏

这个东西其实是可以隐藏和显示的,下面是Google给出的方法,此方法必须在Android 4.0以上

的系统中使用,当然4.0以下也没有(也就是api14),直接把这段代码粘贴在,你的Activity的

onCreate()方法中就可以了:

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);

但是这么做是有缺陷的,Google共给出了5个注意事项,我只看懂以下介个:

a) 使用这种设置flag的方式虽然暂时隐藏了Navigation Bar,但是用户触摸屏幕的任何地方

flags将会被清除,也就是说你的设置,在用户触摸屏幕后会失效

b) 一但你设置的flags被清除后,如果你再想隐藏Navigation Bar,需要重新设置,这个需要

监听一个事件,看文章最后:

c) 你设置UI flags的位置很重要,也就是上面的代码的放置位置,如果你放到onCreate()方法

中的时候,如果用户通过Home键回到桌面,当你重新打开的时候,由于这是onCreate()

方法不会再次被调用,所以Navigation Bar 不再隐藏。如果你想要你的设置在上面的情况

有效你需要在 onResume() or onWindowFocusChanged()

中设置UI flags

d)The method setSystemUiVisibility() only has an effect if the view you call it

from is visible.(哥实在是翻译不出来,也没看懂)我的翻译:只有你调用setSystemUiVisibility()

这个方法的View是可见状态下的时候,这个方法才会起作用。我们都知道,其实Activity的显示是有一个View的

对,就是那个从window中调用的getDecorView()方法,每个Activity都有一个decorview对象,这个就是Activity

的渲染机制了。

e) Navigating away from the view causes flags set with setSystemUiVisibility() to be cleared.

(额,这句英语也是屌的不行)同样我的翻译:

当导航离开这个View的时候会使得通过 setSystemUiVisibility()

这个方法设置的flags被清除,也就是说所有的在这个view上设置的全屏和隐藏NavigationBar的flag都将失效。

高级解决方案,通过按钮事件控制Navigation Bar的显示和隐藏

看下面的代码来自Google的Example,只要在按钮中调用这个方法,就可以随意切换

显示和隐藏Navigation Bar了

/**
* Detects and toggles immersive mode (also known as "hidey bar" mode).
*/
public void toggleHideyBar() { // The UI options currently enabled are represented by a bitfield.
// getSystemUiVisibility() gives us that bitfield.
int uiOptions = getWindow().getDecorView().getSystemUiVisibility();
int newUiOptions = uiOptions;
boolean isImmersiveModeEnabled =
((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
if (isImmersiveModeEnabled) {
Log.i(TAG, "Turning immersive mode mode off. ");
} else {
Log.i(TAG, "Turning immersive mode mode on.");
} // Navigation bar hiding: Backwards compatible to ICS.
if (Build.version.SDK_INT >= 14) {
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
} // Status bar hiding: Backwards compatible to Jellybean
if (Build.VERSION.SDK_INT >= 16) {
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
} // Immersive mode: Backward compatible to KitKat.
// Note that this flag doesn't do anything by itself, it only augments the behavior
// of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample
// all three flags are being toggled together.
// Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
// Sticky immersive mode differs in that it makes the navigation and status bars
// semi-transparent, and the UI flag does not get cleared when the user interacts with
// the screen.
if (Build.VERSION.SDK_INT >= 18) {
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
} getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
}

Navigation Bar 透明遮挡内容

Android 越出越牛X,当Android4.1以后的版本,如果不是必须,不一定非要把他隐藏掉

因为这时候那个你的内容View可以放到Navigation Bar 后面,索引这个时候当navigation bar

显示或者隐藏的时候,不会引起你的内容View重新计算大小。你可以使用SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION.

和 SYSTEM_UI_FLAG_LAYOUT_STABLE来实现。(个人目测这个用途不是太大吧)

Android 4.4Immersive Mode“沉浸式全屏”

这个比较好玩,Status Bar 和 Navigation Bar 是以透明的方式显示的,但是这个要在api 19 之上使用。

沉浸式全屏是什么意思?就是支持沉浸式全屏的应用在Android 4.4的手机上会自动全屏显示,并不会出现恼人的虚拟键

而当我们需要虚拟键的时候,只要在屏幕底部轻轻滑动一下即可调出虚拟键,而且虚拟键是以透明的状态显示的。

Android 4.4 中提供了 IMMERSIVE 和 IMMERSIVE_STICKY 标记, 可以用这两个标记与

SYSTEM_UI_FLAG_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_FULLSCREEN 一起使用, 来实现沉 浸模式。

一个对沉浸模式的理解点击这里

监听事件的方式获取屏幕Navigation Bar的变化,然后做出不同的处理

private static Handler sHandler;  

protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState); sHandler = new Handler(); sHandler.post(mHideRunnable); // hide the navigation bar final View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
{
@Override
public void onSystemUiVisibilityChange(int visibility)
{
sHandler.post(mHideRunnable); // hide the navigation bar
}
});
} Runnable mHideRunnable = new Runnable() {
@Override
public void run() {
int flags;
int curApiVersion = android.os.Build.VERSION.SDK_INT;
// This work only for android 4.4+
if(curApiVersion >= Build.VERSION_CODES.KITKAT){
// This work only for android 4.4+
// hide navigation bar permanently in android activity
// touch the screen, the navigation bar will not show
flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_FULLSCREEN; }else{
// touch the screen, the navigation bar will show
flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
} // must be executed in main thread

        getWindow().getDecorView().setSystemUiVisibility(flags);
}
};

【转】Android 全屏方案(隐藏NavigationBar)的更多相关文章

  1. Android 全屏显示-隐藏Navigation Bar

    Sumsung Galaxy Nexus 屏幕分辨率为 1280X 720,但通常的应用都会显示Navigation Bar(Back 键,Home 键等),如下图所示: 但我注意到Youtube应用 ...

  2. Android 全屏显示

    Android全屏显示: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst ...

  3. android全屏去掉title栏的多种实现方法

    android全屏去掉title栏的多种实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2013-02-18我要评论 android全屏去掉title栏包括以下几个部分:实现应用中的所有ac ...

  4. VMware全屏时, 隐藏上方工具栏横条

    VMware全屏时, 隐藏上方横条 菜单栏打开 编辑 选择 首选项 找到 显示 取消勾选 在全屏时取消固定时显示工具栏边缘

  5. Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)

    http://www.xuebuyuan.com/558284.html 方法一 public class MainActivity extends Activity { @Override prot ...

  6. Android WebView 总结 —— 使用HTML5播放视频及全屏方案

    在APP开发的过程中,会碰到需要在WebView中播放视频的需求,下面讲解一下如何在WebView中使用html5播放视频. 1.让视频在各个Android版本能够正常播放 在AndroidManif ...

  7. Android 全屏相关操作

    1.隐藏标题栏(titlebar) (1)在代码中隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); (2)在Manifest中Applicati ...

  8. vysor原理以及Android同屏方案

    vysor是一个免root实现电脑控制手机的chrome插件,目前也有几款类似的通过电脑控制手机的软件,不过都需要root权限,并且流畅度并不高.vysor没有多余的功能,流畅度也很高,刚接触到这款插 ...

  9. Android 全屏显示的方法(不包含状态栏)

    我们都知道在Android中某些功能的实现往往有两种方法:一种是在xml文件中设置相应属性,另一种是用代码实现.同样Android实现全屏显示也可以通过这两种方法实现: 1.在AndroidManif ...

随机推荐

  1. java文档注释主要使用方法

    一.java包含哪些注释 1.//用于单行注释. 2./*...*/用于多行注释,从/*开始,到*/结束,不能嵌套. 3./**...*/则是为支持jdk工具javadoc.exe而特有的注释语句.这 ...

  2. Linux/Unix 系统分析命令速查手册

    1.Hardware CPU information: cat /proc/cpuinfo 物理core个数: 统计core 逻辑CPU个数:统计processor Memory informatio ...

  3. BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...

  4. NOI2009植物大战僵尸

    这题应该分两步来做: 1.拓扑排序,去掉无敌点 2.求最大闭合子图 需要注意几点: 1.拓扑排序时,如果(i,j)可以攻击到(x,y),那么增加(x,y)的入度,而不是(i,j)的入度 因为入度代表着 ...

  5. [信息OJ 2467] Asakura的难题

     2467: G Asakura的难题 Time Limit:2000MS Memory Limit:65536KB Description Asakura是班里有名的捣蛋鬼,所以经常有同学到老师那里 ...

  6. C# List 使用方法 支持FrameWork2.0 环境

    List查找指定数据 var tmpBillInputCheckList = BillInputCheckList.FindAll(m => m.BillDetailGuid == tmpBil ...

  7. 【开源专访】Sea.js创始人玉伯的前端开发之路

    摘要:玉伯,淘宝前端类库 KISSY.前端模块化开发框架SeaJS.前端基础类库Arale的创始人.本期[开源专访]我们邀请玉伯来为我们分享一些关于前端框架.前端开发的那些事,以及前端大牛是如何炼成的 ...

  8. WCF配置文件详解(一)

    <?xml version="1.0" encoding="utf-8" ?><configuration>    <!-- &l ...

  9. HDU 2295 Radar dancing links 重复覆盖

    就是dancing links 求最小支配集,重复覆盖 精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头) 重复覆盖的时候:只删除列,因为可以重复覆盖 然后重复覆盖有一个估 ...

  10. MSP430F5438点亮led

    今天只是想点亮一个led灯,因为没有视频,搞得很多的东西都是自己摸,下午本来讲和咨询店家,TMD说好给一点技术支持,结果一点也不给,我真想草泥马了,其实代码早就写出来了,只是哥哥不知道这款开发板还有接 ...