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

来源:互联网 发布:网店美工学生实训报告 编辑:程序博客网 时间:2024/04/29 10:38

以前在大号写过一篇同名文章 ,有一天登陆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-


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

支付宝
这里写图片描述

微信
这里写图片描述