Android实现沉浸式状态栏的那些坑

最近项目须要实现沉浸式的状态栏,其实我在以前就了解过Android的沉浸式,发现有些棘手就放弃了,可是这次是公司的项目须要的,就花了几天把这个问题搞定了,在此记录一下,并mark几个坑。
首先,沉浸式是Android 4.4及以上才有的,在后续的5.0及6.0上面都增长了一些相关支持,因而问题就不太好办了。先看我实现的效果:android

首先,在4.4版本添加了WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS 和 WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,即透明的状态栏和导航栏,这里通常会配合布局

android:fitsSystemWindows="true"  
android:clipToPadding="true"  
1
2
一块儿使用,这里只给个连接:http://blog.csdn.net/jdsjlzx/article/details/46778631
因而,下面就说说遇到的问题:字体

第一坑:状态栏背景色
上面的FLAG_TRANSLUCENT_STATUS 只是把状态栏设置为透明的,可是!可是,状态栏是有背景色的,一些手机的状态栏背景色为透明,而一些手机的状态栏背景色为半透明的黑色,实现的效果以下:ui

因而在5.0上增长了WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 和 getWindow().setStatusBarColor(int color),通常使用以下:.net

// 部分机型的statusbar会有半透明的黑色背景
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
getWindow().setStatusBarColor(Color.TRANSPARENT);// SDK21
1
2
3
4
因而,在5.0才能看到清爽的全透状态栏。blog

第二坑:状态栏字体颜色
状态栏的字体颜色默认为白色的,可是咱们应用的主题色为黄色,白色字体在黄色背景上是不易分辨的,因此这里得把状态栏的字体改成深色,想一想这个也是不太好作(其实这个在IOS上面自带的效果),可是在6.0增长了View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,这个字段就是把状态栏标记为浅色,而后状态栏的字体颜色自动转换为深色。
因此,若是须要浅色的状态栏,只能在Android6.0及之后的版本中实现。
这里暗藏一个坑:MIUI6+本身实现了浅色状态栏,可是6.0的这个设置在小米手机上无效,真是 * * *!给个MIUI6沉浸式开发文档:http://dev.xiaomi.com/doc/p=4769/ip

第三坑:输入框顶不起来
原觉得效果实现了就万事大吉,结果后面发现加入沉浸式以后,聊天页面底部的输入框不能被输入法顶起来开发

红色框那里本应该是输入框的。
网上找了好多资料,都说须要加入android:fitsSystemWindows=”true”,可是在activity的根布局加入该属性后,titlebar也会跟着键盘顶上去,这显然不是咱们想要的结果。后面看到有人说,只须要把该属性添加到输入框所在的根布局,按这个方法果真解决问题了:文档

好了,遇到的几个坑都解决了,后面发现新坑再补充!get

另外一个沉浸式实现方案:Android沉浸式通知栏开源库SystemBarTint源码解析

在BaseActivity添加以下方法:

    /**
     * 初始化状态栏相关,
     * PS: 设置全屏须要在调用super.onCreate(arg0);以前设置setIsFullScreen(true);不然在Android 6.0下非全屏的activity会出错;
     * SDK19:能够设置状态栏透明,可是半透明的SYSTEM_BAR_BACKGROUNDS会很差看;
     * SDK21:能够设置状态栏颜色,而且能够清除SYSTEM_BAR_BACKGROUNDS,可是不能设置状态栏字体颜色(默认的白色字体在浅色背景下看不清楚);
     * SDK23:能够设置状态栏为浅色(SYSTEM_UI_FLAG_LIGHT_STATUS_BAR),字体就回反转为黑色。
     * 为兼容目前效果,仅在SDK23才显示沉浸式。
     */
    private void initStatusBar() {
        Window win = getWindow();
        if (mIsFullScreen) {
            win.requestFeature(Window.FEATURE_NO_TITLE);
            win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息栏
            win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 保持屏幕高亮
        } else {
            //KITKAT也能知足,只是SYSTEM_UI_FLAG_LIGHT_STATUS_BAR(状态栏字体颜色反转)只有在6.0才有效
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                win.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏
                // 状态栏字体设置为深色,SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 为SDK23增长
                win.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

                // 部分机型的statusbar会有半透明的黑色背景
                win.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                win.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                win.setStatusBarColor(Color.TRANSPARENT);// SDK21

                isStatusBarTranslate = true;             }         }     } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 点赞 14 ———————————————— 版权声明:本文为CSDN博主「年少的风」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。 原文连接:https://blog.csdn.net/brian512/article/details/52096445

相关文章
相关标签/搜索