需求:自定义界面全屏显示,隐藏导航栏,状态栏

按照google的官方办法,设置如下几个Flag就可以隐藏导航栏:

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对这个方案做了说明:

  • With this approach, touching anywhere on the screen causes the navigation bar (and status bar) to reappear and remain visible. The user interaction causes the flags to be be cleared.(触摸屏幕任何位置,导航栏都会重新出现并保持可见。因为用户交互导致设置的flag被清除了)
  • Once the flags have been cleared, your app needs to reset them if you want to hide the bars again. See Responding to UI Visibility Changes for a discussion of how to listen for UI visibility changes so that your app can respond accordingly.(如果想要导航栏再次隐藏,就要重新设置flag)
  • Where you set the UI flags makes a difference. If you hide the system bars in your activity's onCreate() method and the user presses Home, the system bars will reappear. When the user reopens the activity, onCreate() won't get called, so the system bars will remain visible. If you want system UI changes to persist as the user navigates in and out of your activity, set UI flags in onResume() or onWindowFocusChanged().(不同地方设置UI Flag效果会有影响。在onResume或者onWindowFouncChanged()函数里设置flag永久生效)
  • The method setSystemUiVisibility() only has an effect if the view you call it from is visible.(只有在View是可见状态下,调用setSystemUiVisiblity才会生效)
  • Navigating away from the view causes flags set with setSystemUiVisibility() to be cleared. (离开当前view,会导致利用setSystemUiVisiblity()函数设置的flag被清除)

即该方案有一个问题:一触摸屏幕,导航栏又重新出现

该问题的解决办法是,将flag设置为如下就可以完全全屏,导航栏和状态栏都被隐藏(亲测有效)

private WindowManager mWM = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mMainView = inflater.inflate(R.layout.main, null);WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);//显示的优先级可以调整,显示的顺序可以查看WindowManagerPolicy中getWindowLayerFromTypeLw函数中的返回值
lp.x = 0;//显示的起始位置x
lp.y = 0;//显示的起始位置y
lp.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;
lp.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |         View.SYSTEM_UI_FLAG_FULLSCREEN |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
mWM.addView(mMainView, lp);

官方对这几个flag的解释:

  • SYSTEM_UI_FLAG_HIDE_NAVIGATION

和FLAG_FULLSCREEN、FLAG_LAYOUT_IN_SCREEN一起使用会暂时隐藏导航栏。一旦用户与界面发生交互,导航栏又会出现。

  • SYSTEM_UI_FLAG_LAYOUT_NAVIGATION

  • SYSTEM_UI_FLAG_IMMERSIVE

只有和SYSTEM_UI_FLAG_HIDE_NAVIGATION一起使用才会有效。如果仅仅设置了SYSTEM_UI_FLAG_HIDE_NAVIGATION,没有设置SYSTEM_UI_FLAG_IMMERSIVE,那么只要用户与界面进行交互,导航栏则又会出现。

  • SYSTEM_UI_FLAG_IMMERSIVE_STICKY

只有和SYSTEM_UI_FLAG_FULLSCREEN、SYSTEM_UI_FLAG_HIDE_NAVIGATION其中的一个或两个一起使用时才会有效果。

  • SYSTEM_UI_FLAG_LAYOUT_STABLE

  • SYSTEM_UI_FLAG_FULLSCREEN

  • SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

Android9.0 完全隐藏导航栏、状态栏相关推荐

  1. 全志 强制隐藏导航栏状态栏 Patch

    modify 隐藏导航栏状态栏diff --git a/android/frameworks/base/core/res/res/values/dimens.xml b/android/framewo ...

  2. [高通SDM450][Android9.0]动态控制虚拟导航栏显示与隐藏

    文章目录 开发平台基本信息 问题描述 解决方法 开发平台基本信息 芯片: SDM450 版本: Android 9.0 kernel: msm-4.9 问题描述 虚拟导航栏原生默认是显示的,但是,作为 ...

  3. Android Window悬浮窗窗口全屏(隐藏导航栏状态栏)

    在应用开发中,有时候需要利用弹出全屏的悬浮窗,因为有导航栏显示所以总是不能全屏,所以需要设置某些属性 让窗口全屏显示 例如: 在onCreate中的这段代码 Window window = getWi ...

  4. android10动态显示隐藏导航栏,状态栏

    实现方式:在frameworks里增加一个自定义 的service,接收上层应用广播,然后通过这个service来发送控制显示隐藏的功能,也可以上层应用发送广播直接控制显示隐藏,因为还有其它功能,所以 ...

  5. 微信h5隐藏导航栏和状态栏_导航栏未在SwiftUI中隐藏

    微信h5隐藏导航栏和状态栏 TL;DR: If you can't tap on buttons in the navigation-bar area, you can jump directly t ...

  6. android8.1隐藏导航栏,【EMUI8.0】利用ADB命令隐藏导航栏

    本帖最后由 漫观流水无情 于 2018-7-11 20:33 编辑 近期,看到好多花粉在问更新了8.0之后怎么隐藏导航栏,目前系统内部只有自带的隐藏,很容易误触屏幕底部导致导航栏出现,并不能完全隐藏. ...

  7. Android 9.0 10.0 沉浸式状态栏导致导航栏状态栏灰色蒙层的解决方案

    1.概述 在10.0的系统产品开发中,在app开发中,沉浸式状态栏也是常有的样式,但是设置沉浸式状态栏后,会导致状态栏和导航栏会有灰色蒙层的问题存在 解决方案: DecorView是整个Window界 ...

  8. Android开发UI之隐藏导航栏

    Android开发UI之隐藏导航栏 前言 这一篇我们将讲解: 1.在4.0及以上版本中隐藏导航栏 2.让内容显示在导航栏之后 导航栏进行隐藏,这个特性是Android 4.0版本中引入的. 即便本篇关 ...

  9. dismiss ios pop效果_iOS正确解决隐藏导航栏后push和pop或dismiss和present闪黑问题

    情景: 一级页面不显示导航栏 ,二级页面显示导航栏. 方法一 适用于push/pop: 一级页面中 - (void)viewWillAppear:(BOOL)animated { [super vie ...

最新文章

  1. Docker 容器技术 — docker run
  2. 技术领导力实战笔记一
  3. C#用xpath查找某节点
  4. 设计模式学习笔记-观察者模式
  5. 鼓励自己最有效的20个方法
  6. ZUST蓝桥杯校内选拔赛(java,c)安吉校区
  7. 苹果商店近期审核的问题
  8. 广义加性模型(GAM)
  9. 更改计算机时间格式,修改电脑日期时间显示格式
  10. 什么是卡诺图,如何用卡诺图表示逻辑函数,如何用卡诺图化简逻辑函数
  11. 汉诺塔问题的总结(1)
  12. 计算机存储1pb等于多少kb,存储容量:1TB等于多少GB?1PB等于多少TB?1EB等于多少PB?
  13. MSP-EXP430F5529LP_GPIO
  14. 区块链溯源相比传统追溯有什么优点?
  15. java8(三)Stream API
  16. 姓名+身份证号+人脸动态实名认证(百度)
  17. 计算机等级考试公共知识大纲,二级计算机等级考试大纲
  18. java通过电话号码获取归属地,区号,邮编
  19. 淘宝海报常见的英文字体精选,让你的设计更显逼格!
  20. jmeter使用jd万象手机号码归属地查询接口和保存察看结果树的内容

热门文章

  1. 计算机术语bootstrap,Bootstrap及jackknife刀切法中文讲义.pdf
  2. git --no-verify
  3. live两种读音[liv][laiv]含义上的区别
  4. 艺赛旗(RPA)python 的 tkinter 进度条的实现
  5. 三星Galaxy相机中的专业模式是什么,您可以使用它做什么?
  6. 华硕主板设置RTC自动开机
  7. StatisticsView
  8. 疯狂的 ICO 终于被全面叫停;9 月全球数据库排名,Oracle 跌势明显
  9. 数据仓库,数据集市,数据湖
  10. Linux 内核likely与unlikey