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 Jellybeanif (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);  }
};    

转载于:https://www.cnblogs.com/exmyth/p/5364381.html

【转】Android 全屏方案(隐藏NavigationBar)相关推荐

  1. Android全屏显示隐藏状态栏

    1,概论 工作中经常需要用到全屏的页面,还要隐藏系统状态栏或沉浸式 2,设置全屏 2.1,设置有代码中设置,也有Mainfest.xml中设置theme 2.2,要是全局生效就在application ...

  2. Android全屏,隐藏状态栏和标题栏

    styles 文件设置如下 <resources> <!-- Base application theme. -->     <style name="AppT ...

  3. (AS笔记)Android全透明沉浸式主题样式——全屏沉浸隐藏底部导航栏

           上一章介绍了,Android全透明沉浸式主题样式--顶部状态栏+底部导航栏,教程传送门链接:         (AS笔记)Android全透明沉浸式主题样式--顶部状态栏+底部导航栏   ...

  4. Android全屏显示

    Android全屏显示 一.获取状态栏和导航条的高度: 1. 获取状态栏的高度: public int getStatusBarHeight() {Resources resources = mAct ...

  5. Android投屏方案(基于cling)

    一 .前言 最近做了一个浏览器&视频播放的项目,是在73.0.3683.90版本的chrome源码上修改而来,涉及到抓取网页里视频的播放地址.播放视频.视频投屏.视频下载.网页内广告屏蔽等方面 ...

  6. android 全屏动画_如何创建全屏视频开幕动画

    android 全屏动画 View demo 查看演示 Download Source 下载源 In this in-depth tutorial we want to show you how to ...

  7. Android全屏中adjustResize的失效的解决方案 AndroidBug5497Workaround

    最近做项目中遇到Android全屏中adjustResize失效的问题,网上搜索了一堆后,基本上都是使用AndroidBug5497Workaround这个工具类,但是在实际使用中遇到软键盘不弹出时, ...

  8. android appcompatactivity 隐藏标题栏,android – 全屏隐藏标题(AppCompatActivity)

    我试图在全屏模式下隐藏标题栏.当我尝试使用Activity时,标题栏会消失.但是当我使用AppCompatActivity时,它仍然存在.知道为什么会这样吗?我应该改变其他东西,如清单吗?这是我用来隐 ...

  9. Android全屏播放视频~包括刘海屏、隐藏时间状态栏

    需求是全屏播放视频,刘海屏上面也要播放. 下面是我实现的方式: 首先创建 CustomVideoView 工具类: import android.annotation.TargetApi; impor ...

  10. Android App全屏不隐藏华为虚拟键

    //去掉虚拟按键且全屏显示 //getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ...

最新文章

  1. 27. 代码实例-spring声明式事务
  2. Python Pyc文件
  3. python对文件中的关键词查找替换,实现自动获取配置
  4. P3159-[CQOI2012]交换棋子【费用流】
  5. Common下MadieHelper.cs
  6. M3U8下载,直播源下载,FLASH下载(三)-直播源下载
  7. Sigmoid函数总结
  8. android编程实例-音乐播放器之歌词显示
  9. Linux部署禅道在访问web页面进入www时报错:mysql无法连接(重新解压安装包或者输入命令:setenforce 0即可)
  10. 网络工程师学习路线?
  11. 企业内部控制体系建设路径及启示 ——基于某公司内控建设案例研究
  12. Hive 10、Hive的UDF、UDAF、UDTF
  13. EMC Unisphere客户端连接EMC
  14. 社区团购新一轮“烧钱”大战又要开始?
  15. 8 款浏览器兼容性测试工具介绍,需要的赶紧收藏吧
  16. 【安全科普】揭秘IPS之网络攻击的“字典”
  17. 7-Zip压缩包如何删除密码
  18. Quad Industries、Agfa等公司合作推出塑料12位RFID标签和带有丝印印刷电路的读出
  19. 设计一个彩灯循环控制器
  20. 中文分词方法汇总笔记

热门文章

  1. inline-block的几个问题(还没解决)
  2. CAS单点登陆,URL多出个参数jsessionid导致登陆失败问题
  3. chrome浏览器不展示地址栏的完整路径解决
  4. MyBatis的XML配置文件(三)
  5. 【渝粤题库】陕西师范大学500017 基础物理专题(光、近代)作业
  6. matlab中的小函数
  7. 轻松看懂概率论与图论基础数学知识
  8. MySQL进阶路:从小工到专家的必读书籍和必备工具
  9. C#读写三菱Fx PLC 使用Fx 串口协议 读写Fx3U设备
  10. 机器学习中对不均衡数据的处理方法