Android(安卓)沉浸式状态栏 +DrawerLayout+Toolbar,适配4.4X及以上
概述
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及以上
5x_01.png5x_02.png
4.4及以上
4x_01.png 4x_02.png可以到4.4上的效果还是有差别的,下面给出解决方法:
方法有些拙劣,如果有其他更好的解决办法,请一定告诉我.
- 首先看这张标图效果
这三个颜色,新建工程时都是给出
#3F51B5 #303F9F #FF4081
- 在styles里配置
新建:values-v19和values-v21文件夹,分别在里面创建styles文件,分别配置
values-v19
<?xml version="1.0" encoding="utf-8"?>
values-v21
为什么要这么配置呢,因为本例子用到了CoordinatorLayout,AppBarLayout,Toolar,所以要单独对对Toolbar做处理,看代码:
<?xml version="1.0" encoding="utf-8"?>
可以看到在在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及以上
5x_03.png4.4及以上
4x_03.png可以看到效果就OK了,然后我有测试了7.0效果也是OK的.文笔稍差.
总结
当然了可能你把这个用到你的项目可能会发现有些问题,因为本文是针对郭霖代码处理的,尽可能最小的改动达到效果.要特别注意在v19里
- true
这个要配合代码布局文件使用,要根据自己的项目布局去处理,如这篇文章家杰的博客
本文参考了鸿洋的经典文章
这是我的代码,错误或有更好的方法请告诉我.
更多相关文章
- android在java中动态改变控件大小
- android如果用ListView做一个表格形式
- android 按钮按下效果2
- android layer-list
- [置顶] 通过SIM卡获取GPS,android基站定位原理
- android ImageUtils 图片处理工具类
- 一个Android实现图片的倒影效果的代码示例
- android 打电话程序的实现
- Android(安卓)Webview与Html5交互