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

前言:项目中用到透明式状态栏(网上也有叫沉浸式状态栏的),并要求随着身份的不同呈现不同的颜色。然后拜读了一些大神的文章,大致总结一下。
网上实现方式大致有两种:一种就是鸿洋大神介绍的方式,我称之为代码式;另一种是通过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沉浸式状态栏(透明状态栏)最佳实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值