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自定义标题栏控件(补充)

Android 自定义复合控件之通用标题栏控件发布到jitpack仓库,本文主要讲述该控件的使用方法...

android shape的使用详解以及常用效果(渐变色、分割线、边框、半透明阴影效果等)

shape使用、渐变色、分割线、边框、半透明、半透明阴影效果。 首先简单了解一下shape中常见的属性。(详细介绍参看 api文档) xml version="1.0" encodin...

Ubuntu使用adb连接android手机失败unknown的解决办法

android开发常识介绍

【Android源码编译】在公司内网环境下使用repo获取android源码失败解决办法

背景: 在Linux环境下(虚拟机为 VirtualBox)获取Android源代码的时候, 使用命令:repo init -u git://android.git.kernel.org/platfo...

VS2008安装失败解决办法

  • 2014年01月13日 22:28
  • 27KB
  • 下载

android全屏/沉浸式状态栏下,各种键盘挡住输入框解决办法

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在开发中,经常会遇到键盘挡住输入框的情况,比如登录界面或注册界面,弹出的软键盘把登录或注册按钮挡住了,用户必须把软键盘收起,才能点...
  • smileiam
  • smileiam
  • 2017年04月04日 11:03
  • 14032
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android DrawerLayout使用StatusBarUtil设置状态栏颜色失败的解决办法
举报原因:
原因补充:

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