隐藏状态栏
一个Android应用程序的界面上其实是有很多系统元素的,观察下图:

而打造沉浸式模式的用户体验,就是要将这些系统元素全部隐藏,只留下主体内容部分。

怎么做呢,郭霖的一个Function搞定

//onWindowFocusChanged的调用时机为当一个Activity加载完毕得到或者失去焦点的时候 就会触发

//

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.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_IMMERSIVE_STICKY);
        }
    }

实现的效果如下图所示

然而笔者认为这个模式再好也抵挡不住用户的习惯,下面是笔者的沉浸式模式(仅供参考)。

效果如下图所示:

可以看到状态栏和导航栏都是半透明模式,并没有做到正在的隐藏,喜欢这种效果的往下看。

因为沉浸式模式是在Android19以后(4.4)这里要特别注意所以为了版本兼容这里要用到限定符。

1.打开Styles.xml,在Style.xml中找到

style名字为"AppTheme"的这个样式列表,然后添加以下两个属性表示状态栏和导航栏为半透明状态
<!--状态栏半透明-->
<item name="android:windowTranslucentStatus">true</item>
<!--虚拟按键全透明-->
<item name="android:windowTranslucentNavigation">true</item>
如果提示当前版本不支持着两个属性你需要添加限定符也就是新建Value-19文件夹然后在改目录下新建一个syles.xml文件然后进行添加如果不支持android:windowTranslucentNavigation那还需要新建Value-21然后同时操作,Value-19下面需要把

<item name="android:windowTranslucentNavigation">true</item>变成下面的代码

//表示状态栏半透明

<item name="android:windowTranslucentStatus">true</item>
这个时候样式的部分代码就已经写完了

运行以后你回发现我们导航栏把我们的菜单遮住了,这个时候你需要判断手机是不是有底部的导航栏加入下面的方法进行判断

fun checkDeviceHasNavigationBar(context: Context): Boolean {
    var hasNavigationBar = false
    val rs = context.resources
    val id = rs.getIdentifier("config_showNavigationBar", "bool", "android")
    if (id > 0) {
        hasNavigationBar = rs.getBoolean(id)
    }
    try {
        val systemPropertiesClass = Class.forName("android.os.SystemProperties")
        val m = systemPropertiesClass.getMethod("get", String::class.java)
        val navBarOverride = m.invoke(systemPropertiesClass, "qemu.hw.mainkeys") as String
        if ("1" == navBarOverride) {
            hasNavigationBar = false
        } else if ("0" == navBarOverride) {
            hasNavigationBar = true
        }
    } catch (e:Exception) {
    }
    return hasNavigationBar
}
返回True时也就是有导航栏的时候你需要让跟容器往上移动50DIP,代码如下

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

//判断是否有虚拟按键,如果要增加边距
    if(checkDeviceHasNavigationBar(this))
    {
     //lllayout为跟节点的ID名字dip2px是将dIP装换成PX的函数
        lllayout.setPadding(0,0,0, dip2px(this,50f));
    }
}
 现在就OK了。两种方法都已经介绍完了各取所好吧!

转载于:https://my.oschina.net/u/920274/blog/3065762

Android沉浸式的两种方法相关推荐

  1. android沉浸模式代码,Android沉浸式的两种方法

    隐藏状态栏 一个Android应用程序的界面上其实是有很多系统元素的,观察下图: 而打造沉浸式模式的用户体验,就是要将这些系统元素全部隐藏,只留下主体内容部分. 怎么做呢,郭霖的一个Function搞 ...

  2. Android启动服务的两种方法

    Android启动服务的两种方法 第一种方法 第二种方法 Android 5.0开始,只能使用显式Intent启动服务.其中,启动服务有2种方式,第一种是直接指定想要启动的服务:第二种是使用AIDL的 ...

  3. Android 更新UI的两种方法——handler和runOnUiThread()

    Android 更新UI的两种方法--handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外 ...

  4. Android 沉浸式状态栏的实现方法、状态栏透明

    现在越来越多的软件都开始使用沉浸式状态栏了,下面总结一下沉浸式状态栏的两种使用方法 注意!沉浸式状态栏只支持安卓4.4及以上的版本 状态栏:4.4上是渐变色,5.0上是完全透明,本文模拟器为4.4演示 ...

  5. android apk 签名方法,[转载]Android apk签名的两种方法

    为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动 ...

  6. android语言切换快捷键,Android的语言设置两种方法

    第一种:修改配置文件 位置:build/target/product/languages_full.mk| languages_small.mk,这两个文件里头,有PRODUCT_LOCALES := ...

  7. Android的语言设置两种方法

    第一种:修改配置文件                    位置:build/target/product/languages_full.mk| languages_small.mk,这两个文件里头, ...

  8. android保存连接地址到桌面快捷方式,Android创建桌面快捷方式两种方法

    谈谈在桌面上直接生成.个人觉得这个比较爽快,既然都是快捷方式了干嘛还要再隐藏一层呢?当然喜欢桌面干净的就比较喜欢第二个了. 第一个是通过广播(Broadcast)的形式向Luncher发送请求生成快捷 ...

  9. android显示图片的两种方法

    第一种使用xml文件 1.新建android application 2.将要显示的图片img.png放到res/drawable-mdpi目录下 3.打开res/layout目录下的main.xml ...

  10. Android网络连接的两种方法:apache client和httpurlconnection的比较

    另见http://blog.csdn.net/mingli198611/article/details/8766585 在官方blog中,android工程师谈到了如何去选择apache client ...

最新文章

  1. heritrix 3.2.0 -- 环境搭建
  2. hive与hbase整合
  3. XML 文档(0, 0)中有错误。缺少根元素。
  4. 云计算构建基石之Hyper-V:虚拟机管理
  5. Delphi编程过程中知识累积
  6. python3下载url图片假死_利用Python 向FTP 上传图片,程序假死?
  7. 【017】基于vue.js的网易云web端(实现播放、登录)(Node接口实现)
  8. spring之aop(前置通知,后置通知,环绕通知,过滤通知,异常通知)
  9. R count函数_第477期|R语言绘图之图形组合
  10. unet预测图片全黑/全灰解决方案(keras)
  11. 从ECU和CPU视角理解AutoSar网络管理
  12. Codeforces - Cashback
  13. 基于51单片机---遥控灯
  14. 计算机突然需要管理者密码,为什么windows7旗舰版开启管理员帐号登录需要密码...
  15. L016-老男孩Linux高端运维课程-linux系统文件权限体系实战深入讲解
  16. VLAN原理详解[转载] 网桥--交换机---路由器
  17. gps在linux读取数据,v3s Linux中读取GPS数据。
  18. html php留言板github,GitHub - gtfly/Message-Board--PHP: PHP 简单留言板(PHP Message-Board)
  19. 荣耀10的android在哪,荣耀10怎么投屏? 荣耀10投屏电视教程
  20. 破损的键盘(悲剧的文本)Java UVa11988

热门文章

  1. 广西壮族自治区公安厅信息中心异地容灾系统(三期)采购185万
  2. 微软、google、IBM的某些招聘试题
  3. 【环境保护网】-环保设备_环保设备网_环保产品网_中国环境保护网
  4. Idea导入的项目不能运行
  5. python调用foxmail 发邮件_foxmail 收取已发送邮件
  6. typescript 中函数参数为对象如何效验
  7. 5星|薛兆丰《经济学通识(第二版)》:有趣而反直觉的经济学常识
  8. Spring Boot - 开启 HttpBasic 认证方式
  9. 高级辅助驾驶(ADAS)整理(炒鸡详细)
  10. 从Netty基础到聊天系统和RPC实战-卷二