Android 状态栏那些小坑?
Posted KdanMin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 状态栏那些小坑?相关的知识,希望对你有一定的参考价值。
背景:因为之前老板上次问我我们的app能不能自定义上面的状态栏我说可以啊!当时没管,今天试了下果然很多坑,之前github上也有很多大佬写了一个开源库有兴趣的可以点进去看下支持DrawLayout沉侵式[StatusBarUtil](https://github.com/laobie/StatusBarUtil)感觉好牛逼,像大佬敬礼,我毕竟是个小喽喽,我只能用最蠢的办法!
首先说下关于状态栏当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏实现代码 其实状态栏这东西不是很难,就是通过添加一个跟转态栏一样的View,但是你要计算状态栏的高度不然就会出现重影或者顶上去了,哈哈!下面看看我之前怎么顶上去的,很厉害的哟!
* 动态的设置状态栏 实现沉浸式状态栏
*
*/
private void initState() {
//当系统版本为4.4或者4.4以上时可以使用沉浸式状态栏
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//
LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
linear_bar.setVisibility(View.VISIBLE);
//获取到状态栏的高度
int statusHeight = getStatusBarHeight();
//动态的设置隐藏布局的高度
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();
params.height = statusHeight;
linear_bar.setLayoutParams(params);
}
}
/**
* 通过反射的方式获取状态栏高度
*
* @return
*/
private int getStatusBarHeight() {
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
return getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
我这里直接封装到我的BaseActivity因为每个Activity`这里写代码片`都要用到,代码都不难,想想我们那么多前辈把自己辛苦写的东西全部贡献给github这个大家庭,所以你家里的东西随便拿来用就行了,所以妈妈再也不用担心您不会撸码了,撸着袖子就是干,年轻人不要怂!我这里这是拿着别人的代码,但是用了别人至少给个star不要那么小气,人家写代码也很辛苦的对不对!废话不多说!
看我顶顶顶!
看到没有状态栏的高度,到这里你千万别忘了我们还有TitleBar那些,现在该怎么办?
小伙伴们?怎么解决,一般老司机会这样想:”能不能给个View把他顶上去”,答案是肯定可以的的啦!
但是对于我这种菜鸟我想不到,想不到怎么办?问题总要解决,生活还得继续,于是乎想了一下,我还是不知道?
好坏好坏的,硬是不给我出来!好坏好坏的!
努力思考中………..
咚咚咚 咚咚咚
好吧 好像忘记了什么?我记得好像有个fixSystemWindow设置为true不就行了吗哈哈,试试
但是有点问题,有些可以,有些不可以,再看看,
最后添加个样式
<style name="NoStatusStyle" parent="AppTheme">
<item name="android:windowTranslucentStatus">true</item> <!--状态栏为透明,如果设置为false,则没有黑色条盖住,见下图对比-->
<item name="android:windowTranslucentNavigation">true</item> <!--导航栏为透明-->
<item name="android:statusBarColor">@android:color/holo_green_light</item>
</style>
然后在每一个Activity中添加这样的属性除了那些全屏的Activity这里大家都懂哈!
android:fitsSystemWindows="true"
style="@style/NoStatusStyle"
完美解决!让我亲吻下大地!
推荐文章:
1. Android 沉浸式状态栏的三种实现方式
2.Android 沉浸状态栏
写到最后:
>
好的文章要学会分享,话说今天是GoogleIO大会,以后我们可能慢慢的跟科特林大哥学习了,暂时跟Java老哥,挥泪告别,这个肯定有一段的距离肯定要等到As完美兼容到这里踩坑基本结束,我知道大家还有其他很多方法。大家可以在下面留言,我会虚心接受,转载请注明出处!每天跟代码在一块忍受着孤独与寂寞,但是英雄注定孤独的嘛!我现在是菜鸟,总有一天我也会成为老司机的吗?哈哈玩笑,不管是科特林还是Java编程永远无止境!
结束语:
听说会点赞的人运气不会太差不信你试试!
以上是关于Android 状态栏那些小坑?的主要内容,如果未能解决你的问题,请参考以下文章
Android 4.4 — 半透明状态/导航栏 — fitSystemWindows/clipToPadding 不能通过片段事务工作