Fragment切换中适配"沉浸式状态栏"

传送门:
fitSystemWindow属性的作用
http://blog.csdn.net/wangxp423/article/details/79564244
fitSystemWindow属性实战
http://blog.csdn.net/wangxp423/article/details/79566465
适配“沉浸式”状态栏
http://blog.csdn.net/wangxp423/article/details/79596329


前三篇我们讲解实现“沉浸式”状态栏相关的一些代码。本篇我们讲述在Fragment切换的时候适配”沉浸式”状态栏

一:前提

本篇是在上面三篇的第三篇《适配“沉浸式状“态栏》传送门;在这一篇的基础上的第二种适配方案(顶部添加View,修改View颜色)的基础上进行的。
此篇中的顶部的标题栏是写在Fragment的布局中的。而不是写在外部Activity的布局中。如果写在外部的话就更简单了。

二,适配效果图

下图是小米6.0.1系统适配效果
Fragment切换中适配

下图是5.0系统适配效果
Fragment切换中适配

我们可以效果是可以的,适配规则也是按照第三篇中的规则进行适配的。

三,主要部分代码

这一部分主要是fragment切换代码,主要就是切换的时候控制添加View的显示和隐藏,根据标题栏背景色是否是浅色,控制状态栏字体和图标颜色。

    @OnClick(R.id.fragment_title_blue)
    public void changeTitleBlue() {
        setStatusBarPlaceVisible(true);
        setViewColorStatusBar(false,getResources().getColor(R.color.colorPrimary));
        selectFragment(0);
    }

    @OnClick(R.id.fragment_title_red)
    public void changeTitleRed() {
        setStatusBarPlaceVisible(true);
        setViewColorStatusBar(false,getResources().getColor(R.color.colorAccent));
        selectFragment(1);
    }

    @OnClick(R.id.fragment_title_white)
    public void changeTitleWhite() {
        setStatusBarPlaceVisible(true);
        setViewColorStatusBar(true,Color.WHITE);
        selectFragment(2);
    }

    @OnClick(R.id.fragment_title_image)
    public void changeTitleImage() {
        setStatusBarPlaceVisible(false);
        setViewColorStatusBar(false,Color.WHITE);
        selectFragment(3);
    }
    /**
     * 根据版本不同 修改添加View的颜色
     * 适配白底标题栏(方案二)顶部添加View,改变View颜色
     * 适配方案2, 4.4以下的不适配,4.4-6.0修改View颜色为浅灰色,6.0以上修改View颜色为白色,修改状态栏字体颜色
     *
     * @param isLight 标题栏颜色是否为浅色(白色)
     */
    protected void setViewColorStatusBar(boolean isLight, int statusBarPlaceColor) {
        //6.0+ 小米 魅族 可以直接适配 一般情况下6.0以上都是透明
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M || OsUtil.isMIUI() || OsUtil.isFlyme()) {
            setStatusBarTextDark(isLight);
            setStatusBarPlaceColor(statusBarPlaceColor);
        } else {
            if (statusBarPlaceColor == Color.WHITE) {
                statusBarPlaceColor = 0xffcccccc;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //4.4以上修改为浅灰色
                setStatusBarPlaceColor(statusBarPlaceColor);
            } else { //4.4以下不适配
                setStatusBarPlaceVisible(false);
            }
        }
    }

    protected void setStatusBarPlaceVisible(boolean isVisible){
        if (isVisible){
            mViewStatusBarPlace.setVisibility(View.VISIBLE);
        } else{
            mViewStatusBarPlace.setVisibility(View.GONE);
        }
    }

    protected void setStatusBarPlaceColor(int statusColor) {
        if (mViewStatusBarPlace != null) {
            mViewStatusBarPlace.setBackgroundColor(statusColor);
        }
    }

fragment中代码就不贴了,前三个图片就是线性布局中一个标题栏一个TextView,第四个就是一个ImageView。

这里在简单说一下:
//本来想以第三篇中的第一种适配方式来写,且标题栏是在fragment中的,以为会比较简单,结果遇到了诸多问题。简单说一下问题吧。
//第一种适配方式修改状态栏颜色,主要配合的是fitSystemWindow属性。他作用于布局文件中的第一个View中,如果后面的View也设置这个属性是无效的。
//用这个属性在Fragment切换的时候有下面弊端,下面简单介绍一下
//1,如果fitSystemWindow设置在Fragment里面的第一个View中,在切换的时候发现只有第一个生效,后面的fragment不生效。
//2,如果从有标题栏切换到无标题栏,即顶端是大图的情况,不需要有fitSystemWindow的属性,即该属性需要是false。(这个我没有试过不知道是否切换设置是否生效,大家可以试一下)
//如果用第一种方案进行适配,最好是标题栏在外部Activity里面,只需要控制标题栏的颜色和显示隐藏,大家有兴趣的可以试一下。


下面上源码在(StatusBar研究)里面,欢迎交流
https://github.com/wangxp423/ViewExercise


个人公众号“Code之旅”
Fragment切换中适配
欢迎扫码关注个人公众号“Code之旅”

个人gitHub地址:https://github.com/wangxp423

你可能感兴趣的:(Android相关)