[奇技淫巧] Android 4.4 5.0 6.0 6.0+ 另一种思路的沉浸式状态栏

以前在大号写过一篇同名文章 ,有一天登陆CSDN,网站居然要绑定手机号,于是尝试绑定手机号时发现手机号已被另一个ID绑定,没法解锁。看了下文章有很多地方需要修改,不得不另立新号重写文章。

引用:
[奇技淫巧] Android 4.4 5.0 6.0 另一种思路的沉浸式状态栏
自己的文章,可惜要绑定手机,基本是告别这个ID了
http://blog.csdn.net/HQS515/article/details/73608633


思路:网上大多数教程讲怎么样设置状态栏背景颜色,各版本适配下来比较繁琐。仔细一想自定义标题栏的做法,为啥不直接去掉状态栏,然后自己写一个状态栏上去呢,颜色就变得可控?


写一个枚举判断版本

  private enum SystemOS {
        API00("Android 1.1以上"),
        API19("Android 4.4以上"),
        API21("Android 5.0以上"),
        API23("Android 6.0以上");
        String desc;

        SystemOS(String desc) {
            this.desc = desc;
        }
    }

对应判断版本的方法

    static {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {                                                                   //0.0 <= system < 4.4
            systemOS = SystemOS.API00;
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {   //4.4 <= system < 5.0
            systemOS = SystemOS.API19;
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {        //5.0 <= system < 6.0
            systemOS = SystemOS.API21;
        } else {                                                                                                                    //6.0 <= system
            systemOS = SystemOS.API23;
        }
    }

关键点:
去除顶部状态栏

        Window window = activity.getWindow();
        window.setFlags(
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        view.setSystemUiVisibility(View.INVISIBLE                             //隐藏状态栏半透明背景,同时Activity会伸展全屏显示
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);    //Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮
        View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR                                  // 设置状态栏文字为暗色 6.0以上
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE                                     // 设置状态栏文字为浅色

计算statusBar的方法:

    private 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;
    }

完整的方法:

public class StatusBarUtil {
    private boolean isTransparent;
    private View view = null;
    private static SystemOS systemOS = SystemOS.API00;
    private Activity activity;

    static {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {                                                                   //0.0 <= system < 4.4
            systemOS = SystemOS.API00;
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {   //4.4 <= system < 5.0
            systemOS = SystemOS.API19;
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {        //5.0 <= system < 6.0
            systemOS = SystemOS.API21;
        } else {                                                                                                                    //6.0 <= system
            systemOS = SystemOS.API23;
        }
    }

    public StatusBarUtil getImageLayout(Activity activity, int resId) {
        return getNewLayout(activity, resId, 0, true);
    }

    public StatusBarUtil getBaseLayout(Activity activity, int resId, int statusBarColor) {
        return getNewLayout(activity, resId, statusBarColor, false);
    }

    /**
     * 生成新界面
     *
     * @param resId          activity资源布局
     * @param statusBarColor 颜色
     * @param isTransparent  设置顶部是否为透明
     * @return
     */
    private StatusBarUtil getNewLayout(Activity activity, int resId, int statusBarColor, boolean isTransparent) {
        this.isTransparent = isTransparent;
        this.activity = activity;
        LogUtils.d("Current System version:", Build.VERSION.SDK_INT);
        if (systemOS == SystemOS.API00) { //Api18以下 Android 4.3及其以下
            view = LayoutInflater.from(activity).inflate(resId, null);
            this.isTransparent = true;
            return this;
        }


        Window window = activity.getWindow();
        window.setFlags(
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

        if (isTransparent) {
            view = LayoutInflater.from(activity).inflate(resId, null);
        } else {
            FrameLayout.LayoutParams baseParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
            LinearLayout linearLayout = new LinearLayout(activity);
            linearLayout.setOrientation(LinearLayout.VERTICAL);
            linearLayout.setLayoutParams(baseParams);

            View statusView = new View(activity);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            layoutParams.height = getStatusBarHeight(activity);
            statusView.setLayoutParams(layoutParams);
            LogUtils.d("Color:", statusBarColor);
            try {
                statusView.setBackgroundColor(statusBarColor);
            } catch (Exception e) {
                int defaultColor = Color.RED;
                statusView.setBackgroundColor(defaultColor);
            }

            linearLayout.addView(statusView);
            LayoutInflater.from(activity).inflate(resId, linearLayout, true);
//            linearLayout.addView(layout);
            view = linearLayout;
        }
        return this;
    }

    public View buildLayout() {
        return buildLayout(true);
    }

    /**
     * 创建layoutView
     *
     * @param isShowBarBackColor 清除statusBar背景色,设置是否显示半透明背景颜色
     */
    public View buildLayout(boolean isShowBarBackColor) {
        if (systemOS == SystemOS.API00 || systemOS == SystemOS.API19) {

        } else if (systemOS == SystemOS.API21 || systemOS == SystemOS.API23) { //5.0 6.0
            if (isShowBarBackColor) {
                if (systemOS == SystemOS.API23) {
                    view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
                }
            } else {
                if (systemOS == SystemOS.API23) {
                    view.setSystemUiVisibility(View.INVISIBLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
                } else {
                    view.setSystemUiVisibility(View.INVISIBLE);
                }

            }
        }
        return view;
    }


    private 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;
    }

    private enum SystemOS {
        API00("Android 1.1以上"),
        API19("Android 4.4以上"),
        API21("Android 5.0以上"),
        API23("Android 6.0以上");
        String desc;

        SystemOS(String desc) {
            this.desc = desc;
        }
    }
}

使用方式: 在Activity的onCreate()中使用本段代码就行:

 protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (isTransparentStatusBar()) {
            view = new StatusBarUtil().getImageLayout(mActivity, resId).buildLayout(false);
        } else {
            int color = ActivityCompat.getColor(mContext, R.color.activity_background_normal);
            view = new StatusBarUtil().getBaseLayout(mActivity, resId, color).buildLayout(false);
        }

        setContentView(view);
 }

-over-


有什么疑问可以留言
如果感觉帮到了你 提升了效率 也可以打赏一下小弟

支付宝
这里写图片描述

微信
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值