透明式状态栏-全代码实现方式

前言:项目中用到透明式状态栏(网上也有叫沉浸式状态栏的),并要求随着身份的不同呈现不同的颜色。然后拜读了一些大神的文章,大致总结一下。
网上实现方式大致有两种:一种就是鸿洋大神介绍的方式,我称之为代码式;另一种是通过style+xml实现,我称之为xml式。经过我自己的测试,xml式在android4.4出现navigationbar的背景色被覆盖的情况,本人暂时没有找到比较好的解决办法,故推荐采用第一种方式,即代码式。
实现步骤:

1、4.4之后加入windowTranslucentStatus的属性之后,可以用到状态栏的区域。由于5.0提供了setStatusBarColor去设置状态栏颜色,但是这个方法不能在主题中设置windowTranslucentStatus属性。

故可以在oncreate中添加如下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
       getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
 }

2、根据第一点中分析,需要用到鸿洋大神写的方法StatusBarCompat。传送门

/**
 * Created by zhy on 15/9/21.
 */
public class StatusBarCompat
{
    private static final int INVALID_VAL = -1;
    private static final int COLOR_DEFAULT = Color.parseColor("#20000000");

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void compat(Activity activity, int statusColor)
    {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        {
            if (statusColor != INVALID_VAL)
            {
                activity.getWindow().setStatusBarColor(statusColor);
            }
            return;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
        {
            int color = COLOR_DEFAULT;
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            if (statusColor != INVALID_VAL)
            {
                color = statusColor;
            }
            View statusBarView = new View(activity);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    getStatusBarHeight(activity));
            statusBarView.setBackgroundColor(color);
            contentView.addView(statusBarView, lp);
        }

    }

    public static void compat(Activity activity)
    {
        compat(activity, INVALID_VAL);
    }


    public static int getStatusBarHeight(Context context)
    {
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0)
        {
            result = context.getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
}

3、以上两点还需要设置setFitsSystemWindows=true的属性,才能保证页面达到预想效果。代码如下:

ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
View parentView = contentFrameLayout.getChildAt(0);
if (parentView != null && Build.VERSION.SDK_INT >= 14) {
    parentView.setFitsSystemWindows(true);
}

4、说明:如果项目中要求整体设计统一,可以在BaseActivity中进行设置。如果仅仅是部分activity中有此需求,可以在响应的activity中调用即可。当然前提是项目采用的NoActionBar的主题。

源码:选择statusbar Module可以查看源码

参考博文:
张鸿洋:Android 沉浸式状态栏攻略 让你的状态栏变色吧
Android沉浸式状态栏(透明状态栏)最佳实现

猜你喜欢

转载自blog.csdn.net/Heijinbaitu/article/details/79619341
今日推荐