[置顶] Android 状态栏那些小坑?

时间:2021-10-13 17:14:38

背景:因为之前老板上次问我我们的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不要那么小气,人家写代码也很辛苦的对不对!废话不多说!

看我顶顶顶!

[置顶]
        Android 状态栏那些小坑?

看到没有状态栏的高度,到这里你千万别忘了我们还有TitleBar那些,现在该怎么办?

小伙伴们?怎么解决,一般老司机会这样想:”能不能给个View把他顶上去”,答案是肯定可以的的啦!

但是对于我这种菜鸟我想不到,想不到怎么办?问题总要解决,生活还得继续,于是乎想了一下,我还是不知道?

[置顶]
        Android 状态栏那些小坑?

好坏好坏的,硬是不给我出来!好坏好坏的!

努力思考中………..

[置顶]
        Android 状态栏那些小坑?

咚咚咚 咚咚咚

好吧 好像忘记了什么?我记得好像有个fixSystemWindow设置为true不就行了吗哈哈,试试

但是有点问题,有些可以,有些不可以,再看看,

[置顶]
        Android 状态栏那些小坑?

[置顶]
        Android 状态栏那些小坑?

最后添加个样式

 <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 沉浸状态栏

写到最后:

kotlin

>

好的文章要学会分享,话说今天是GoogleIO大会,以后我们可能慢慢的跟科特林大哥学习了,暂时跟Java老哥,挥泪告别,这个肯定有一段的距离肯定要等到As完美兼容到这里踩坑基本结束,我知道大家还有其他很多方法。大家可以在下面留言,我会虚心接受,转载请注明出处!每天跟代码在一块忍受着孤独与寂寞,但是英雄注定孤独的嘛!我现在是菜鸟,总有一天我也会成为老司机的吗?哈哈玩笑,不管是科特林还是Java编程永远无止境!

结束语:

听说会点赞的人运气不会太差不信你试试!