开坑啦!
首先简单介绍一下什么是CACW。
CACW是我当前正在开发的一款Android应用的代号,中文名是蚂蚁团队,主要功能是协助各类团队进行团队项目的管理及其任务的分配,主要功能包括任务定时提醒、任务分配、团队项目管理等功能,服务器端采用C++编写程序,android端采用Material design设计风格进行设计。为了记录下我在开发这款应用时踩到的各种坑,我将会在以后不定时的更新这应用的开发进度。
目前这款应用开发进度大概是30%左右,首先来说说今天的主题吧————Android状态栏透明。
首先先上一下最终效果图:
Material design设计规范对状态栏的推荐标准
根据Google官方文档,状态栏的颜色应该是colorPrimaryDark,或者是透明度为20%的黑色半透明遮罩。
但是问题在于那个20%的半透明可能没那么简单,因为半透明状态栏在android4.4(v19)以上才能实现,而如果使用不恰当就会有各种问题。例如EidtText光标不会随着软键盘的弹出而自动上浮,挡住了EditText。
存在的障碍
此前,针对4.4状态栏透明的做法一般是设置windowTranslucentStatus = true,这样布局将会忽略状态栏,将内容往上顶,toobar就会和statusbar重叠,因此在放置toolbar的时候需要设置margin,或者在状态栏的位置放置一个View来恢复正常的布局。这样又涉及到了计算statusbar高度的问题。
statusbar的高度为25dp(最新的android 6.0是24dp)
但是在android5.x上如果照搬4.4的解决方案其实并不合理,原因在于TranslucentStatus在5.x以上的表现不同,遮罩层颜色过深,不太符合Material Design的标准。
解决方案
经过一番搜索,我在这里找到了可以解决问题的答案。
如果不需要支持 4.4,建议直接使用 statusBarColor
如果需要支持 4.4,建议 4.4 使用 windowTranslucentStatus;5.x 使用 statusBarColor/colorPrimaryDark
1. 添加style
首先在sytle.xml里面定义半透明状态栏。分别新建v19和v21两个style,加入以下style:
v19
<style name="translucent_status" parent="AppTheme">
<item name="android:windowTranslucentStatus">true</item>
</style>
v21
<style name="translucent_status" parent="AppTheme">
<item name="android:statusBarColor">#33000000</item>
</style>
注意:因为android4.4以下没有透明状态栏的选项,因此在无修饰符的style.xml里面也要定义一个同名的style保证在低版本下运行不会因为找不到style而崩溃。
2.修改manifest
在manifest里面定义theme属性。
android:theme="@style/translucent_status"
3.修改activity代码
因为StatusBarColor并不会将布局上移,因此我们需要加上:
Window window = getActivity().getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
4.修正toolbar位置
因为布局上移了因此toolbar和statusbar会重叠,如果你是像我一样的懒人,你可以设置margin:
<item name="android:layout_marginTop">@dimen/status_bar_height</item>
dimens.xml:
<dimen name="status_bar_height">25dp</dimen>
(当然如果为了支持最新的android6.0你可能还需要新建一个v23版本的dimens,设置为24dp)
你也可以选择在java里动态获取statusbar的高度(未验证):
public int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
5.添加 fitsSystemWindow=”true”(可选)
因为android4.4的方案可能会导致EditText被软键盘挡住,因此如果有用到Edittext则需要在v19版本的布局文件根布局设置 fitsSystemWindow=”true”。
需要注意的是,不要同时设置windowTranslucentNavigation,这样会导致上面的方案失效
这就是目前在android4.4以上实现透明状态栏的方案啦,希望能够对大家有帮助!
下期节目再见。