Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案

原文地址:http://blog.csdn.net/ys408973279/article/details/49994407


1.Android5.0以上:半透明(APP 的内容不被上拉到状态)

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第1张图片

2.Android4.4以上:全透明(APP 的内容不被上拉到状态)

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第2张图片

3.Android4.4以下:不占据status bar

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第3张图片

这里我们就按照qq在各个android的版本显示进行适配: 1.Android5.0以上:material design风格,半透明(APP 的内容不被上拉到状态) 2.Android4.4(kitkat)以上至5.0:全透明(APP 的内容不被上拉到状态) 3.Android4.4(kitkat)以下:不占据status bar

主题: 使用Theme.AppCompat.Light.NoActionBar(toolbar的兼容主题):既可以适配使用toolbar(由于google已经不再建议使用action bar了,而是推荐使用toolbar,且toolbar的使用更加的灵活,所以toolbar和actionbar的选择也没什么好纠结的)和不使用toolbar的情况(即自定义topBar布局)。

fitSystemWindows属性: 官方描述: Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity. 简单描述: 这个一个boolean值的内部属性,让view可以根据系统窗口(如status bar)来调整自己的布局,如果值为true,就会调整view的paingding属性来给system windows留出空间.... 实际效果: 当status bar为透明或半透明时(4.4以上),系统会设置view的paddingTop值为一个适合的值(status bar的高度)让view的内容不被上拉到状态栏,当在不占据status bar的情况下(4.4以下)会设置paddingTop值为0(因为没有占据status bar所以不用留出空间)。

具体适配方案(一边看代码一边解析): activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>            

这里我们include了一个mytoolbar_layout的布局:

mytoolbar_layout.xml:

在mytoolbar_layout.xml里:布局一个 android.support.v7.widget.Toolbar(使用支持包里的toolbar可以兼容低版本android系统),并设置minHeight="?attr/actionBarSize"和fitSystemWindows为true。

MainActivity.java:
package com.thinkcool.statusbaradapt;import android.os.Bundle;import android.support.v7.widget.Toolbar;public class MainActivity extends BaseActivity {    Toolbar toolbar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //让toolbar同actionbar一样使用,include自定义的topbar时注释到下面两句        toolbar = (Toolbar) findViewById(R.id.my_toolbar);        setSupportActionBar(toolbar);    }}

在MainActivity.java里,继承BaseAcitivity(后面描述),实例化toolbar并调用setSupportActionBar,之后就可以让toolbar像action bar一样使用了。

BaseActivity.java:
package com.thinkcool.statusbaradapt;import android.os.Build;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.Window;import android.view.WindowManager;public class BaseActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            Window window = getWindow();            // Translucent status bar            window.setFlags(                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);        }    }}

在BaseActivity.java里:我们通过判断当前sdk_int大于4.4(kitkat),则通过代码的形式设置status bar为透明(这里其实可以通过values-v19 的sytle.xml里设置windowTranslucentStatus属性为true来进行设置,但是在某些手机会不起效,所以采用代码的形式进行设置)。还需要注意的是我们这里的AppCompatAcitivity是android.support.v7.app.AppCompatActivity支持包中的AppCompatAcitivity,也是为了在低版本的android系统中兼容toolbar。

AndroidManifest.xml中:使用Theme.AppCompat.Light.NoActionBar主题

.......

最后build.gradle中引入v7支持库(需要注意v7版本得大于21): compile 'com.android.support:appcompat-v7:23.1.1'

看看效果吧(同qq状态栏效果,依次是:不透明(4.4以下),透明(4.4以上),半透明(5.0以上)): Android4.4以下:不占据status bar

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第4张图片

Android4.4以上:全透明(APP 的内容不被上拉到状态)

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第5张图片

Android5.0以上:半透明(APP 的内容不被上拉到状态)

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第6张图片 这套适配方案的好处: 1.通过include mytoolbar.xml和mytopbar.xml可以方便的在使用toolbar和使用自定义topbar中进行抉择。 2.使用fitSystemWindows属性让系统帮我们自动适配不同情况下的status bar,让我们的view的paddingTop获取到一个合理的值。(还有其他的方案是通过手动设置paddingTop的值来进行适配的:在values-v19里设置paddingTop值为25dp,在values里设置为0dp,但是在某些自定义的rom里status bar的高度是被有修改过的。还有就是通过自定义继承toolbar,在代码里动态获取status bar的高度并设置paddingTop的值,但这样又弄得太麻烦了)。

自定义topBar的情况(因为我们的UI设计师不一定跟得上material design的步伐,而且总是在有着不一样的设计风格,这个时候自定义topbar就最好了如:qq的topbar就是自定义的):

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>                                            

在activity_main.xml里:include自定义的mytopbar_layout.

mytopbar_layout.xml:

<?xml version="1.0" encoding="utf-8"?>                                    
修改MainActivity.java:
package com.thinkcool.statusbaradapt;import android.os.Bundle;import android.support.v7.widget.Toolbar;public class MainActivity extends BaseActivity {    Toolbar toolbar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //让toolbar同actionbar一样使用,include自定义的topbar时注释到下面两句//        toolbar = (Toolbar) findViewById(R.id.my_toolbar);//        setSupportActionBar(toolbar);    }}

MainActivity.java里:我们注释掉了setSupportActionBar(因为这是我们自定义的topbar). 同样看看实现效果吧: Android4.4以下:不占据status bar

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第7张图片

Android4.4以上:全透明(APP 的内容不被上拉到状态)

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第8张图片

Android5.0以上:半透明(APP 的内容不被上拉到状态)

【Android基础学习】Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案_第9张图片

最后代码上传gitHub(欢迎fork,加星): https://github.com/CoolThink/StatusBarAdapt.git


注: 小米的5.0系统也是4.4的效果



更多相关文章

  1. [Android View 知识体系] 必知必会 View 基础知识
  2. Android基础教程之-------Android中两种设置全屏的方法!!!
  3. Android:view常用属性和操作方法
  4. Android Service 基础详解
  5. android drawable 属性描述
  6. Android ComboBox -- Spinner基础使用
  7. android xml之动画篇 alpha、scale、translate、rotate、set的属
  8. 【Android开发经验】android:windowSoftInputMode属性详解

随机推荐

  1. Android(安卓)新版个税计算小demo程序
  2. Android应用程序永久获取root权限方法
  3. view对touch事件的处理
  4. Android(安卓)adb shell 命令
  5. [转]android 几何图形的绘制
  6. android post 提交数据
  7. android之意图
  8. 【Android(安卓)Studio】Android(安卓)St
  9. Android(安卓)Butterknife框架
  10. Android(安卓)wifi详解