【第22期】观点:IT 行业加班,到底有没有价值?

Android DrawerLayout使用StatusBarUtil设置状态栏颜色失败的解决办法

原创 2016年06月01日 09:43:29

本文是处于5.0以上系统的环境下进行的,以下暂时未能验证。

  • 众所周知,4.4以下状态栏一般是无法改变颜色的,就是系统默认的黑色。4.4以上之后,系统可以设置状态栏颜色了。一般我们在进行状态栏适配的时候,就会分三种情况,4.4以下、4.4以上、和5.0以上。

  • 之前我在适配的时候,4.4以上选择的半透明,5.0以上是不透明,也就是ToolBar是什么颜色,状态栏就是什么颜色。勉强称之为沉浸式状态栏。

问题就出现在了这里,当DrawerLayout内的状态栏怎么设置颜色?

  • 所以这里我使用了第三方–StatusBarUtil,它有一个方法,setColorNoTranslucentForDrawerLayout可以设置不透明的状态栏颜色。此时我的布局时这个样子的。如下:
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/main_coord"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        >

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/main_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

        </android.support.design.widget.AppBarLayout>

        <com.bzh.dytt.base.widget.XViewPager
            android:id="@+id/main_viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"          app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    </android.support.design.widget.CoordinatorLayout>
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>

</android.support.v4.widget.DrawerLayout>
  • 设置结果是失败,状态栏是黑色,依然不能改变状态栏的颜色。于是,我翻了翻StatusBarUtil的源码,看看它是如何给DrawerLayout的状态栏改变颜色的。源码如下:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        // 生成一个状态栏大小的矩形
        View statusBarView = createStatusBarView(activity, color);
        // 添加 statusBarView 到布局中
        ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);
        contentLayout.addView(statusBarView, 0);
        // 内容布局不是 LinearLayout 时,设置padding top
        if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {
            contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);
        }
        // 设置属性
        ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);
        drawerLayout.setFitsSystemWindows(false);
        contentLayout.setFitsSystemWindows(false);
        contentLayout.setClipToPadding(true);
        drawer.setFitsSystemWindows(false);

        addTranslucentView(activity, statusBarAlpha);

它的原理是这样的,先判断版本,然后将状态栏设置为透明,然后给包含ToolBar的这个主布局,顶端再加一个矩形块,这个矩形块的颜色和ToolBar的颜色一致。
在我这里的问题是,DrawerLayout内左侧菜单栏就是NavigationView,而主布局就是CoordinatorLayout。所以这里就是要给CoordinatorLayout的顶端再加一个矩形块替代状态栏。
而源码里又有这样一段代码,if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null)

  • 所以最终的解决办法是:给CoordinatorLayout外层再裹一层LinearLayout。
  • 此时布局如下:
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.design.widget.CoordinatorLayout
            android:id="@+id/main_coord"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
        >

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/main_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

        </android.support.design.widget.AppBarLayout>

        <com.bzh.dytt.base.widget.XViewPager
            android:id="@+id/main_viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    </android.support.design.widget.CoordinatorLayout>
</LinearLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>

</android.support.v4.widget.DrawerLayout>

以上

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

沉浸式状态栏颜色设置,对android4.4~6.0的总结

好吧,鸿洋大神已经讲得非常清楚了 http://blog.csdn.net/lmj623565791/article/details/48649563首先,我了解的状态栏颜色设置必须android4...

Android 状态栏工具类(实现沉浸式状态栏/变色状态栏)

博客源址:http://laobie.github.io/android/2016/03/27/statusbar-util.html 这是一个为Android App 设置状态栏的工具类, 可以在...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

DrawerLayout+Toolbar的使用及状态栏透明

今天本来想着用一下官方的DrawerLayout,然后就试了试,中间突然觉得和toolbar一起来,然后我加上刚学的透明状态栏,觉得挺好,就开搞,没想到遇到了很多坑 先看效果图DrawerLayout...

Android动态修改状态栏沉浸色(取图片颜色)

项目要求  滑动图片卡,背景会自动变色,并且动态修改状态栏沉浸色 关键代码 : 在图片切换的回调接口中 执行 Bitmap bit = drawableToBitmap(re...

Android 沉浸式状态栏攻略 让你的状态栏变色吧

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/48649563; 本文出自:【张鸿洋的博客】 一、概述近期注意到QQ...

Android沉浸式状态栏

Android沉浸式状态栏   Sample Download StatusBarUtil-Demo 更新日志 1.2.5 添加 @ColorInt 注解,现在如果传入 R....

Android状态栏一体化(沉浸式)的实现(Eclipse版)

自从Android Studio使用以来,那是各种开发方便啊!什么状态栏,导航栏轻松搞定。而Eclipse开发就没那么开心了。又不能complete.有时还不能找到相应的开发Jar包。只能靠自己解决。...

Android StatusBarUtil:设置Android系统下方虚拟键键盘透明度

 Android StatusBarUtil:设置Android系统下方虚拟键键盘透明度 Android StatusBarUtil是github上的一个开源项目,主页:https://g...

翻翻git之---简单易用的状态栏工具库 StatusBarUtil

转载请注明出处:王亟亟的大牛之路前天写的一篇RxJava的文章里用到了翔哥的沉浸式菜单栏的一个类,然后觉得还是有很多拓展的空间的,因为它只是改了颜色,然后我就去翻Git心里想的是如果没有翻到就自己写了...

android:一行代码实现沉浸式布局效果

先看效果 效果一:效果二: 首先要引入statusbaruitl库 compile 'com.jaeger.statusbaruitl:library:1.1.1' 在Activity中一行代码实现:...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)