笔记——充分利用系统状态栏空间

在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属性就可以了。

猜你喜欢

转载自blog.csdn.net/ting1406525501/article/details/81948005