如何动态兼容沉浸式状态栏是什么意思模式

大家都知道,传统的手机状态栏非黑即白,经常让整个app显得不是那么的好看,如何让状态栏的颜色跟你整个界面的颜色能够融为一体,这是我们一直想要的,现在给大家展示一下:

由图可见,第一张是没有使用沉浸式状态栏,显示的颜色为白色,由的手机显示的是黑色,第二张图,是实用了沉浸式状态栏,整体的视觉效果比第一张要好。

}

注:有些4.4的系统上面状态栏并不是全透明的,而是渐变的。

你会发现,已经实现了沉浸式状态栏效果了。如果运行在5.0以上的机器上面,会发现大部分手机会出现状态栏是半透明的,效果图如下:

我们能不能让将5.0以上的手机也设置为和4.4一样的全透明的状态栏呢?答案是肯定的!Android自5.0起,又为我们提供了设置状态栏颜色的API,我们可以自己设置状态栏的颜色。
在代码中再加入如下代码:

 

再在运行看看效果,状态栏已经变成全透明了。6.0运行效果图和上面4.4一样,就不再附图了。

默认状态栏字体颜色是白色的,如果ToolBar的颜色较浅,那么状态栏上白色的字看不怎么清楚。

Android6.0以后,我们可以使用代码将状态栏字体的颜色设置为黑色了,代码如下:

设置了深色状态栏字体的效果图如下:

如果你认为已经已经完美实现了,那真是too young to simple。下面是一些我踩过的坑。

如果在界面中有EditText的话,你会发现当软件盘弹出的时候(Activity已经设置了adjustResize),ToolBar的内容都被顶上去了,但是EditText输入框却被有顶上来(正常情况应该是ToolBar没事,输入框被软键盘顶上去),如下图:

 

去掉ToolBar的fitsSystemWindows属性,并加上加上上面的代码,软键盘弹出时ToolBar正常了,但是输入框还是没有弹出来。

试了之后你会发现,果然可以,但是输入框的高度变了,其实是输入框的padding增加了状态栏的高度。如果设计和产品能接受这种效果,那这也不失为一种解决方法。很显然,一般都不会接受这种效果的,就算设计和产品能接受,我们开发也不能接受!

那有没有更好的方法呢?到网上搜索发现下面一种解决方案。

 
 
 

然后运行,输入框能够正常被顶上去,而且输入框的布局有没有受到影响。

该解决方案的原理是,给界面的根布局设置一个监听器,当界面大小有变化的时候,如键盘弹出的时候,重新设置一下根布局的高度,再调用requestLayout对界面进行重绘。

注:不知道这种解决方案会不会引起其他的问题,目前暂时没有发现,如果哪位知道有什么问题,请指点一下,谢谢!

将上面的沉浸式代码放在EMUI3.1系统的手机(如华为荣耀7)上面跑,你会发现,根本没有沉浸式效果,状态栏是透明的,显示的是桌面上的颜色,如下图:

经验证,原来是EMUI3.1系统的原因,很多App(如网易云音乐等)也是在EMUI3.0上有沉浸式的效果,到了EMUI3.1却没有效果了。在EMUI3.1没有沉浸式效果如果和4.4以前一样是黑的也就算了,这样透明的显示桌面颜色实在难看。
后来发现去掉下面这句代码,可以让其有沉浸式的效果。

不过它的状态栏不是全透明的,而是像某些4.4的系统一样是渐变的,不过总比原来的效果好。

 
 

ActionMode是一种Context Menu,它悬浮在ToolBar活着ActionBar上面。现在已经基本上很少app在用ActionMode了,所以可能很多人可能没有用过,没用过的可以看看这篇文章

公司项目中使用到了ActionMode(历史遗留代码),在实现沉浸式的效果中,发现ActionMode并不支持沉浸式。ActionMode弹出来的时候,状态栏会变成黑色的,效果如下:

遇到这个问题的时候,第一想法就是能不能和ToolBar一样给ActionMode设置一个值为状态栏高度的padding,然后将它顶到状态栏里面去。

看到能将ActionMode顶到状态栏中去时心里已经在开始偷着乐了,接下来只要给ActionMode设置一个padding即可。然而发现ActionMode根本没有提供在代码中设置高度和padding的API,只能在style中设置高度和padding。这样就有一个问题,因为Android手机碎片化严重,导致不同厂商的不同手机状态栏的高度不一致,所以使用这个方法会出现有的手机ActionMode弹出时比ToolBar高或者低,不过也还能接受。

如果仅仅这样也就算了,没想到又引起了另外一个问题。在使用上面的flag之后(flag不能乱加啊,血和泪的教训),虽然ActionMode顶到状态栏了,但是在某些(如华为)带虚拟按键的手机(虚拟按键对开发者来说也是一个大坑),虚拟按键会遮挡底部的布局。
只能放弃这种方案,尼玛,怎么这么多坑,让我哭会(泪崩)!

没办法,问题还是得去解决啊!继续寻找其它解决方案。。。

这时候想到了在Android5.0以上我们可以设置状态栏的颜色,那可不可以在ActionMode弹出来的时候,给状态栏设置一个与ToolBar颜色一致的颜色呢?尝试一下吧,在BaseActivity中重写startSupportActionMode方法,在里面给状态栏设置颜色,具体代码如下:

 

没想到,居然可以。不过只能兼容5.0以上的手机,4.4还是黑色。目前也只能这样了,后期项目中估计会将ActionMode干掉吧,到时候就OK了。如果大家又更好兼容ActionMode的方法请指点一下,谢谢!!!


}

在所需设置为全屏模式的逻辑的onCreat()方法中加入以下代码即可:

效果如图(适合有背景图的页面):

2、修改style中AppTheme中状态栏颜色(适合普通页面),如:

}

我要回帖

更多关于 沉浸式状态栏 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信