在Android5.0系统之前,我们是无法对状态栏的背景或颜色进行操作的,那个时候也还没有Material Design的概念。但是Android5.0及之后的系统都是支持这个功能的,因此这里我们就来实现一个系统差异型的效果,在Android5.0及之后的系统中,使用背景图和状态栏融合的模式,在之前的系统中使用普通的模式。
在CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout这种嵌套结构的布局
想要让背景图能够和系统状态栏融合,需要借助android:fitSystemWindows这个属性来实现。在CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout这种嵌套结构的布局中,将控件的android:fitSystemWindows属性指定成true,就表示该控件会出现在系统状态栏里。所以,如果想要图片和系统状态栏融合到一起,我们必须将ImageView布局结构中的所有父布局都设置上这个属性才可以(ImageView也需要设置)。
即使我们将android:fitSystemWindows属性都设置好了还是没有用的,因为还必须在程序的主题中将状态栏颜色指定为透明色才行。指定成透明色的方法很简单,在主题中将android:statusBarColor属性的值指定成@android:color/transparent就可以了。但问题在于,Android:statusBarColor这个属性是从API21,也就是Android5.0系统开始才有的,之前的系统无法指定这个属性。那么,系统差异型的功能实现就要从这里开始了。
右击res目录->New->Directory,创建一个values-v21目录,然后右击values-v21目录->New->Values resource file,创建一个styles.xml文件。接着对这个文件进行编写,代码如下所示:
<resources> <style name="FruitActivityTheme" parent="AppTheme"> <item name="android:statusBarColor">@android:color/transparent</item> <style> <resources>
这里我们定义了一个FruitActivityTheme主题,它是专门给FruitActivity使用的。FruitActivityTheme的parent主题是AppTheme,也就是说,它继承了AppTheme中的所有特性。然后我们在FruitActivityTheme中将状态栏的颜色指定成透明色,由于values-v21目录是只有Android5.0及以上的系统才会去读取的,因此这么声明是没有问题的。
但是Android5.0之前的系统却无法识别FruitActivityTheme这个主题,因此我们还需要对values/styles.xml文件进行修改,如下所示:
<style name="FruitActivityTheme" parent="AppTheme"></style>
可以看到,这里也定义了一个FruitActivityTheme主题,并且parent主题也是AppTheme,但是它的内部是空的。因为Android5.0之前的系统无法指定状态栏的颜色,因此这里什么都不用做就可以了。
最后,我们还需要让FruitActivity使用这个主题才可以,修改AndroidManifest.xml中的代码,如下所示:
<activity android:name=".FruitActivity" android:theme="@style/FruitActivityTheme"/>
非 Design Support库实现背景图和状态栏融合到一起的效果
修改onCreate()代码
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if(Build.VERSION.SDK_INT>=21){
View decorView=getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
getWindow.setStatusBarColor(Color.TRANSPARENT);
}
setContentView(R.layout.activity_layout);
}
这样处理之后,可以实现背景图和状态栏融合到一起的效果,不过,可以看到头布局几乎和系统状态栏紧贴到一起了,这是由于系统状态栏已经成为了我们布局的一部门,因此没有单独为它留出空间。当然,这个问题也是非常好解决的,借助android:fitsSystemWindows属性就可以了。