Android沉浸状态栏兼容4.4API笔记

手上有一台古老的小米三,平常也没用,昨天拿出来运行下项目的时候发现状态栏是黑乎乎的。有强迫症的我就受不了了,于是就查了下4.4的Android兼容沉浸状态栏。

Android Studio兼容##

在Github上有一个开源的系统栏管理器框架,叫Systembartint
首先,将其引用到项目当中: compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
再来看下官方Demo的使用方法。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_match_actionbar);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        setTranslucentStatus(true);
    }

    SystemBarTintManager tintManager = new SystemBarTintManager(this);
    tintManager.setStatusBarTintEnabled(true);
    tintManager.setStatusBarTintResource(R.color.statusbar_bg);

  }
  @TargetApi(19) 
  private void setTranslucentStatus(boolean on) {
    Window win = getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    if (on) {
        winParams.flags |= bits;
    } else {
        winParams.flags &= ~bits;
    }
    win.setAttributes(winParams);
}

使用方法还是比较简单的,代码量不大。集成到工程的BaseActivity当中执行。
运行结果:

Android沉浸状态栏兼容4.4API笔记_第1张图片
运行结果

很明显的View往上移动了。
然后继续查看官方的sample源码。

Android沉浸状态栏兼容4.4API笔记_第2张图片
然而发现有一个api19的styles

然后在项目当中创建一个19api的styles 使用这个主题。然而。。。崩溃了。
然后修修改改 修修改改 后 改好了。。。 最后修改好的styles

在项目的res目录下 创建一个叫values-v19的文件夹,然后创建styles.xml文件夹把以下代码复制过去



    

最后上一下修改好后完整的BaseActivity
BaseActivity代码 因为我当时创建项目的时候 默认的主题是Theme.AppCompat.Light.DarkActionBar 所以需要隐藏一下ActionBar

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //判断api是否是19和20 才进行适配 21以上的版本就不需要自己再去兼容了
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT || Build.VERSION.SDK_INT ==Build.VERSION_CODES.KITKAT_WATCH) {
        setTranslucentStatus(true);
        SystemBarTintManager tintManager = new SystemBarTintManager(this);
        tintManager.setStatusBarTintEnabled(true);
        tintManager.setStatusBarTintResource(R.color.colorPrimary);
    } else {
            getSupportActionBar().hide();//隐藏Action
    }
}

最后 需要在res目录下再建立一个values-v21的文件夹 也放入一个style.xml文件,这个xml文件可以直接在values目录下把style复制过来,至于原因是因为,已经指定了19的api了,在运行程序的时候,系统发现有指定api的style的话,会去引入距当前系统api版本最近的一个style,当然,它是不会引用比当前系统更高api的style。所有如果不去指定21的style的话,那么它会引用api19的style,当然,也可以使用v19的style,但是这样的话,就得兼容>=19的API,在BaseActivity的onCreate中 修改if条件 改为:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //判断api大于或等于19
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ) {
        setTranslucentStatus(true);
        SystemBarTintManager tintManager = new SystemBarTintManager(this);
        tintManager.setStatusBarTintEnabled(true);
        tintManager.setStatusBarTintResource(R.color.colorPrimary);
    } else {
            getSupportActionBar().hide();//隐藏Action
    }
}

最后运行结果

Android沉浸状态栏兼容4.4API笔记_第3张图片
最后修改的运行结果

Eclipse兼容

Eclipse的话 不需要集成依赖 直接调用setColor即可 起初有在android studio中使用 然而 崩溃了,但是在Eclipse上倒是正常。
这个方法记得好像是在一个csdn的博客上看到的,抱歉,不记得地址了

public static void setColor(Activity activity, int color) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        View statusView = createStatusView(activity, color);
        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
        decorView.addView(statusView);
        ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
        rootView.setFitsSystemWindows(true);
        rootView.setClipToPadding(true);
    }
}

private static View createStatusView(Activity activity, int color) {
    int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
    int statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
    View statusView = new View(activity);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            statusBarHeight);
    statusView.setLayoutParams(params);
    statusView.setBackgroundColor(color);
    return statusView;
}

你可能感兴趣的:(Android沉浸状态栏兼容4.4API笔记)