关于 Android 状态栏的适配总结

1.要求状态栏透明,咱们的内容布局延伸到系统状态栏,就是人们口中说的沉浸式状态栏:

Android 5.0 及其之后版本:设置属性 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 使得咱们的内容布局能够延伸到系统状态栏,而后直接使用方法 setStatusBarColor() 把系统状态栏设置成透明就行了。java

Android 4.4 ~ Android 5.0 :添加了属性 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) 可让状态栏变成透明,而且使咱们们的内容布局延伸到系统状态栏。这个属性虽然也能够在 Android 5.0 及其之后版本的手机上使用,可是效果不是咱们想要的。android

在 Android 4.4 以前是不支持透明状态栏微信

须要注意的一点是在设置透明状态栏的状况下,是须要咱们的内容布局延伸到状态栏的,所以这个时候使用 fitSystemWindows 这个属性是没有意义的,只会使得出现各类奇葩的效果。app

2.状态栏颜色和咱们布局颜色搭配

其实在有的时候,咱们是不须要把咱们的内容布局延伸到系统状态栏的,只是须要系统状态栏和咱们的内容布局的颜色搭配起来。函数

**Android 5.0 及其之后版本:**直接经过 setStatusBarColor() 或者 修改colorPrimaryDark 对应的颜色,把系统状态栏颜色设置成搭配的颜色就能够了布局

**Android 4.4 ~ Android 5.0:**这个版本实际上是不容许直接修改状态栏的颜色的,只不过咱们利用了一种巧妙的方法,感受是修改了状态栏的颜色而已。经过 getWindow().addFlags(WindowManager.LayoutParams.FALG_TRANSLUCENT_STATUS) 是状态栏透明,而且咱们的布局也会延伸到状态栏,给咱们的内容布局设置一个 padding,给这个 padding 设置一个合适的颜色来充当系统状态栏的颜色就能够了。字体

Android 4.4 以前是不支持修改的spa

其实状态栏的适配无外乎这两点了,注意必定要针对不一样的 Android 版本使用不一样的方法,不可乱用,不可混用,否则会有各类奇葩效果!3d

效果图

Android 4.4 之前

状态栏永远是黑底白字,没有方法改变。上面的全部的方法也是不适用的。code

Android4.4如下.png

Android 4.4~Android 5.0

Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 这种模式,使用这种模式可使内容布局占据状态栏,效果:

Android4.4透明no.png

android:fitsSystemWindows = "true" 属性
能够理解为给所使用的布局设置了状态栏大小的 padding。只会做用于 Toolbar 和 根布局。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:background="@color/main_green_00b661"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
<!--    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tb"
        app:title="@string/activity_status_bar"
        app:titleTextColor="@android:color/white"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:background="@color/colorAccent">
    </android.support.v7.widget.Toolbar>-->
    <TextView
        android:fitsSystemWindows="true"
        android:background="@color/main_green_00b661"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:text="11"
        android:textColor="#000"/>
    <ImageView
        android:contentDescription="@string/text_input"
        android:id="@+id/iv"
        android:scaleType="fitXY"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:src="@mipmap/imga"/>
    <TextView
        android:background="@color/colorAccent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="11"
        android:textColor="#000"/>
</LinearLayout>

好比,布局是这样的,fitsSystemWindows 只有在根布局 LinearLayout 或者 ToolBar 上有用,在别的 View 上使用是没有效果的。
复制代码

LinearLayout 使用 fitsSystemWindows

Android4.4透明toolbar-yes.png

ToolBar 设置 fitsSystemWindows 效果

Android4.4透明toolbar-yes.png

能够看到效果了。其实就是至关于给布局设置了 padding top(高度至关于系统状态栏的高度),可是考虑到兼容性的问题,若是你直接在布局中设置 paddingtop 而不是经过 FitsSystemWindows 这个属性,那么在 Android 4.4 如下的手机上运行的话,那么效果就很糟糕了,由于 Android 4.4 如下的手机,系统状态栏都是始终存在的,也就是说,这样始终比 Android 4.4 以上系统的手机布局多一块 padding ,由于这一块 padding 无法在系统状态栏上。可是使用 fitsSystemWindo 就会完美适配了,由于这个属性在 Android 4.4 如下的系统上是不起做用的。注意在使用 fitsSystemWindow 的时候,颜色问题,不一样的手机系统,可能会形成延伸到状态栏的那一块颜色不一样,理论上颜色应该和根布局的颜色同样。

Android 5.0

到了 Android 5.0 关于状态栏又发生了变化,新增了直接对状态栏的操做,直接改变状态栏颜色,这一点在以前版本是没有的,Android 4.4 虽然能够实现改变状态栏颜色的效果,但其实其实是将咱们的布局占据了状态栏,而后状态栏是透明的。其实颜色仍是咱们布局的颜色。

对 Android 5.0 的采起

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面对 Android 4.4 的方法是同样的);
复制代码

效果图:

Android5.0透明no.png

Android 6.0

在 Android 6.0 添加了能够更改状态栏字体颜色的方法,别的都是和 Android 5.0 同样的。

状态栏字体颜色默认是白色。能够修改成黑色。

方法:getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// 方法
/* * 当 insets 视图插入,window 已经更改了,视图层次结构调用。容许它调整内容来适应这些窗口。这个 insets 会告诉咱们 status bar、input method 和其余系统 window 的空间。 一般状况下咱们是不须要处理此功能的,由于应用程序的默认窗口修饰会将其应用于窗口内容。若是咱们使用 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 或者 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 的时候,则须要处理这个函数了,这个时候若是咱们不处理,咱们的视图内容就会默认放在系统视图的下面。若是咱们但愿系统视图不覆盖UI的某些部分,则能够在视图层次结构中使用此方法。 默认状况下,只是将 insets(将 insets 设置为 0 )作为 View 的 padding。而且返回true。默认状况下,此行为是关闭的,可是能够经过 setFitsSystemWindows(boolean)启用。 此功能在层次结构中的遍历是深度优先的。 相同的内容insets对象沿着层次结构向下传播,所以对其所作的任何更改都将被全部后续视图看到(包括层次结构中的上层视图,由于这是深度优先遍历)。 返回true的第一个视图将停止整个遍历。 */
fitSystemWindows(Rect insets);
复制代码

欢迎你们关注个人微信公众号,和我交流分享
相关文章
相关标签/搜索