手上有一台古老的小米三,平常也没用,昨天拿出来运行下项目的时候发现状态栏是黑乎乎的。有强迫症的我就受不了了,于是就查了下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当中执行。
运行结果:

3404887-55dae1e4238c828b

很明显的View往上移动了。
然后继续查看官方的sample源码。
然而发现有一个api 19的styles

3404887e9b52a5c23c8e5b7.png

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

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

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <!--兼容4.4API沉浸状态栏-->
            <item name="android:windowTranslucentStatus">true</item>
            <item name="android:fitsSystemWindows">true</item>
        </style>
    </resources>

最后上一下修改好后完整的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
        }
    }

最后运行结果

34048876b57989843c9a85e.png

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