Android更改状态栏颜色

这里我就不讲状态栏是什么东西了,有关状态栏的代码我们可以在网上找到一大堆,我今天给大家就说说我的思路,以及我在写的过程中所踩的坑。

按照惯例先上代码https://github.com/GitHubToLiao/statusbarutils.git

先说下使用方法
在我们想要修改状态栏的Activity中加上下面这句代码就可以了

  StatusBarUtils.setActivityTranslucent(this);

在Activity添加这一句代码就可以改变状态栏的颜色是不是很简单

我们在写的时候分为两步

一、5.0以上
5.0以上系统给我们提供了一个修改状态栏颜色的方法,我们在用用的时候进行判断呢

  Window window = activity.getWindow();
  //如果系统5.0以上
  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(color);
    }

这里我有踩过一个坑,就是在有些5.0手机系统上会没有效果。这里我添加一个Flage就可以

     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

二、4.4到5.0之间
在4.4到5.0之前系统是没有给我们提供直接修改状态栏颜色的方法,但是我们可以想一些办法做到修改状态颜色的办法。
1.将手机设置为全屏

 Window window = activity.getWindow();
  //首先设置全屏
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

2.我们只要给布局中添加一个View然后修改View的背景颜色这样就可以做到修改状态栏颜色的效果了。

  //给decorView添加一个布局
  ViewGroup decorView = (ViewGroup) window.getDecorView();

  View view = new View(activity);
  view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight(activity)));
  view.setBackgroundColor(color);
  decorView.addView(view);

这里我是给 decorView里面添加的View至于为什么要用decorView,是因为decorView他的布局时LinearLayout

3.我们运行之后会发现虽然状态栏是修改了,但是我们的内容确整体向上移动,有一部分内容在状态栏下面了。这个问题的解决方法我们可以在我们的布局的根布局中添加一个属性

    android:fitsSystemWindows="true"

这样写虽然解决了问题,但是如果我们想改变状态栏颜色的话那么每个布局的根布局都需要添加上面的代码,这样写是不是很烦。

关于上面的问题我们可以在帮助类中写好,后面直接用就可以了

   ViewGroup activityView = (ViewGroup) activity.findViewById(android.R.id.content);
            activityView.getChildAt(0).setFitsSystemWindows(true);

最后我们根据上面写的,变通一下就可以完成沉浸式效果了

    /**
     * 设置Activity全屏
     * @param activity
     */
    public static void setActivityTranslucent(Activity activity){
        Window window =activity.getWindow();
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            ViewGroup decorView = (ViewGroup) window.getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

在这里基本已经写完了,现在我就把帮助类的所有代码贴出来

public class StatusBarUtils {
    /**
     * 为我们的 activity 的状态栏设置颜色
     * @param activity
     * @param color
     */
    public static void setStatusBarColor(Activity activity,int color){
        Window window = activity.getWindow();
        //如果系统5.0以上
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(color);
        }else if(Build.VERSION.SDK_INT >=  Build.VERSION_CODES.KITKAT){
            //4.4到5.0
            //首先设置全屏
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //给decorView添加一个布局
            ViewGroup decorView = (ViewGroup) window.getDecorView();

            View view = new View(activity);
            view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight(activity)));
            view.setBackgroundColor(color);
            decorView.addView(view);

            ViewGroup activityView = (ViewGroup) activity.findViewById(android.R.id.content);
            activityView.getChildAt(0).setFitsSystemWindows(true);

        }
    }

    /**
     * 获取状态栏的高度
     * @param activity
     * @return
     */
    private static int getStatusBarHeight(Activity activity) {
        // 插件式换肤:怎么获取资源的,先获取资源id,根据id获取资源
        Resources resources = activity.getResources();
        int statusBarHeightId = resources.getIdentifier("status_bar_height","dimen","android");
        Log.e("TAG",statusBarHeightId+" -> "+resources.getDimensionPixelOffset(statusBarHeightId));
        return resources.getDimensionPixelOffset(statusBarHeightId);
    }

    /**
     * 设置Activity全屏
     * @param activity
     */
    public static void setActivityTranslucent(Activity activity){
        Window window =activity.getWindow();
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            ViewGroup decorView = (ViewGroup) window.getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

}

猜你喜欢

转载自blog.csdn.net/liao5214/article/details/75093908