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
其实在有的时候,咱们是不须要把咱们的内容布局延伸到系统状态栏的,只是须要系统状态栏和咱们的内容布局的颜色搭配起来。函数
**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
状态栏永远是黑底白字,没有方法改变。上面的全部的方法也是不适用的。code
Android 4.4 引入了 FLAG_TRANSLUCENT_STATUS 这种模式,使用这种模式可使内容布局占据状态栏,效果:
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
ToolBar 设置 fitsSystemWindows 效果
能够看到效果了。其实就是至关于给布局设置了 padding top(高度至关于系统状态栏的高度),可是考虑到兼容性的问题,若是你直接在布局中设置 paddingtop 而不是经过 FitsSystemWindows
这个属性,那么在 Android 4.4 如下的手机上运行的话,那么效果就很糟糕了,由于 Android 4.4 如下的手机,系统状态栏都是始终存在的,也就是说,这样始终比 Android 4.4 以上系统的手机布局多一块 padding ,由于这一块 padding 无法在系统状态栏上。可是使用 fitsSystemWindo 就会完美适配了,由于这个属性在 Android 4.4 如下的系统上是不起做用的。注意在使用 fitsSystemWindow 的时候,颜色问题,不一样的手机系统,可能会形成延伸到状态栏的那一块颜色不一样,理论上颜色应该和根布局的颜色同样。
到了 Android 5.0 关于状态栏又发生了变化,新增了直接对状态栏的操做,直接改变状态栏颜色,这一点在以前版本是没有的,Android 4.4 虽然能够实现改变状态栏颜色的效果,但其实其实是将咱们的布局占据了状态栏,而后状态栏是透明的。其实颜色仍是咱们布局的颜色。
对 Android 5.0 的采起
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); (和上面对 Android 4.4 的方法是同样的);
复制代码
效果图:
在 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);
复制代码