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>

以上

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

Android StatusBar 状态栏颜色设置

导读:最近在使用自己手机,发现一种动画效果非常不错,就是天气随着时间季节,状态栏和ToorBar颜色都会发生改变,搜索资料得出的三种方案….方案一 将手机状态栏透明化: 状态栏透明了,状态栏的颜色...
  • u012792686
  • u012792686
  • 2016年11月01日 17:33
  • 5242

设置系统状态栏颜色

开门见山,先来三张效果图:      然后我们再来讲如何实现以及如何快速地实现。 如何实现 实现设置系统状态栏颜色需要至少在Android 4.4.2(API 1...
  • mafei852213034
  • mafei852213034
  • 2016年06月27日 17:38
  • 1627

DrawerLayout沉浸式状态栏

在开发过程中,往往在UI上需要用到沉浸式状态栏 但是有很多坑在里面 在DrawerLayout(侧滑抽屉)为根部局的时候,网上找到的沉浸式状态栏代码往往会失效要么是可以状态栏改颜色,而抽屉画出来的...
  • a791404623
  • a791404623
  • 2017年09月25日 14:16
  • 547

Android透明状态栏

使用说明:Android4.4以上才有这种效果,附源码 1.导包:compile ‘com.android.support:design:24.1.1’ 2.自定义StatusBarView pub...
  • u011106915
  • u011106915
  • 2016年09月22日 14:30
  • 1359

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

这是一个为Android App 设置状态栏的工具类, 可以在4.4及其以上系统中实现 沉浸式状态栏/状态栏变色,支持设置状态栏透明度,满足你司设计师的各种要求(雾)。 本着不重复造轮子的原则,在网...
  • lixuce1234
  • lixuce1234
  • 2017年06月30日 13:38
  • 1828

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

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

StatusBarUtil 状态栏工具类

0: 项目中遇到需求,需要改变状态栏,发现一个工具类很好用,写篇文章记录下。 1: StatusBarUtil一个关于状态栏操作起来超简单工具类 开个传送门 ...
  • weixin_39119676
  • weixin_39119676
  • 2017年08月08日 14:55
  • 306

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

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

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

本文是处于5.0以上系统的环境下进行的,以下暂时未能验证。 众所周知,4.4以下状态栏一般是无法改变颜色的,就是系统默认的黑色。4.4以上之后,系统可以设置状态栏颜色了。一般我们在进行状态栏适配的时候...
  • JadynAi
  • JadynAi
  • 2016年06月01日 09:43
  • 2438

android如何使系统标题栏颜色和导航栏颜色一致

我们经常可以在App中看到这样一种效果:               可以看到,状态栏与App自身的标题栏融合在了一块,相比于原生黑色的状态栏,给用户的整体视觉效果更佳,那么如何实现An...
  • zhangjin12312
  • zhangjin12312
  • 2017年08月09日 15:49
  • 1651
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android DrawerLayout使用StatusBarUtil设置状态栏颜色失败的解决办法
举报原因:
原因补充:

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