概述
Android 状态栏沉浸式基于4.4及以上, Android 系统名字、版本、API level的对应关系如下:
Code name | Version | Cool |
---|---|---|
Nougat | 7.1 | API level 25 |
Nougat | 7.0 | API level 24 |
Marshmallow | 6.0 | API level 23 |
Lollipop | 5.1 | API level 22 |
Lollipop | 5.0 | API level 21 |
KitKat | 4.4-4.4.4 | API level 19 |
Jelly Bean | 4.3.x | API level 18 |
Jelly Bean | 4.2.x4 | API level 17 |
Jelly Bean | 4.1.x | API level 16 |
所以说只有在kitkat及以上才能实现沉浸式效果
诱因
前两天看郭霖的第二行代码,章节第十二部分主要是写了关于Material Design UI设计,界面很是炫酷,其中包括DrawerLayout+Toolbar的使用界面很是炫酷,写的也是通俗易懂,代码连接,但是本书是基于5.0写的,所以效果没有适配到4.4x上.
他的效果代码截图:
5.0及以上
4.4及以上
可以到4.4上的效果还是有差别的,下面给出解决方法:
方法有些拙劣,如果有其他更好的解决办法,请一定告诉我.
- 首先看这张标图效果
这三个颜色,新建工程时都是给出
#3F51B5
#303F9F
#FF4081
- 在styles里配置
新建:values-v19和values-v21文件夹,分别在里面创建styles文件,分别配置
values-v19
values-v21
为什么要这么配置呢,因为本例子用到了CoordinatorLayout,AppBarLayout,Toolar,所以要单独对对Toolbar做处理,看代码:
可以看到在在Toolbar里让布局在v19里是
同样的道理这个时候Toolbar的高,也要出处理,在v19里面要设置更高些,因为它得一部分是嵌入到状态里面的
所以在values values-v19 values-v21都设置了Toolbar的高度,在19里单独设置了80dp ,其他的都是54,这个值可以自己来衡量
- 在代码里面要重新处理4.4x情况如下:
Activity
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
StatusBarCompat.compat(this);
这里如果是在4.4上就要另外添加一个颜色块到状态栏
public class StatusBarCompat {
private static final int statusColor = Color.parseColor("#303F9F");
public static void compat(Activity activity ) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
View statusBarView = contentView.getChildAt(0);
//改变颜色时避免重复添加statusBarView
if (statusBarView != null && statusBarView.getMeasuredHeight() == getStatusBarHeight(activity)) {
statusBarView.setBackgroundColor(statusColor);
return;
}
statusBarView = new View(activity);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight(activity));
statusBarView.setBackgroundColor(statusColor);
contentView.addView(statusBarView, lp);
}
}
public static int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
}
- 下面来看看效果
5.0及以上
4.4及以上
可以看到效果就OK了,然后我有测试了7.0效果也是OK的.文笔稍差.
总结
当然了可能你把这个用到你的项目可能会发现有些问题,因为本文是针对郭霖代码处理的,尽可能最小的改动达到效果.要特别注意在v19里
- true
这个要配合代码布局文件使用,要根据自己的项目布局去处理,如这篇文章家杰的博客
本文参考了鸿洋的经典文章
这是我的代码,错误或有更好的方法请告诉我.