状态栏的设置和沉浸式模式的理解

来源:互联网 发布:部落冲突 女武神数据 编辑:程序博客网 时间:2024/05/14 19:38

设置状态栏:http://blog.csdn.net/maosidiaoxian/article/details/51734895

设置系统状态栏颜色需要至少在Android 4.4.2API 19)以上


android 4.4.2新增了一个特性,可以设置系统状态栏为半透明。

实现方式一是在主题style中添加以下属性:

<item name="android:windowTranslucentStatus">true</item>

实现方式二是在Java代码中设置,即以下代码:

Window window = activity.getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
实现的后的效果就相当于将整个屏幕放在一个帧布局中,状态栏在上部,我们的界面在下部,而状态栏还是透明的效果


若希望将状态栏不挡住我们的界面,还要定义一种颜色效果,可以在我们的界面顶部添加一个和状态栏相同高度的view,背景设置成我们希望的背景。

通过往Window窗口的decorView添加一个View,让它大小与系统状态栏一样,然后设置这个view的背景,就可以实现修改状态栏颜色的效果了

ViewGroup decorViewGroup = (ViewGroup) window.getDecorView();

View statusBarView = new View(window.getContext());

int statusBarHeight = getStatusBarHeight(window.getContext());

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, statusBarHeight);

params.gravity = Gravity.TOP;

statusBarView.setLayoutParams(params);

statusBarView.setBackgroundColor(color);

decorViewGroup.addView(statusBarView);


获取状态栏高度的方法代码如下:

    private static int getStatusBarHeight(Context context) {        int statusBarHeight = 0;        Resources res = context.getResources();        int resourceId = res.getIdentifier("status_bar_height", "dimen", "android");        if (resourceId > 0) {            statusBarHeight = res.getDimensionPixelSize(resourceId);        }        return statusBarHeight;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然后在我们的Activity的onCreate方法中使用以上代码就可以了。

Android 5.0.1(API 21)

window.setStatusBarColor(color);

使它生效,必须设置一个FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS属性,并且确保FLAG_TRANSLUCENT_STATUS不被设置

Window window = activity.getWindow(); //取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//设置状态栏颜色

window.setStatusBarColor(color);


Android 6.0

//取消设置透明状态栏,使 ContentView 内容不再覆盖状态栏

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜色

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//设置状态栏颜色

window.setStatusBarColor(color);

由于与API 19设置状态栏半透明并添加一个View的实现方式不同,这里是直接设置状态栏的颜色的,所以如果我们的状态栏被设为白色的话,

上面同样白色的系统状态就看不到了。不过,6.0的API新增了一个属性来解决这一问题。即,

如果我们设置的状态栏颜色是接近于白色的话,可以在主题中添加以下属性:

<item name="android:windowLightStatusBar">true</item>
  • 1
  • 1

这样,系统状态的那些文字图标就会变成黑色了,如一开始我们所看到的第三张图。 
通过JAVA代码来设置的话如下:

    View decor = window.getDecorView();    int ui = decor.getSystemUiVisibility();    if (lightStatusBar) {        ui |=View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;    } else {        ui &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;    }    decor.setSystemUiVisibility(ui);

沉浸式模式:

http://blog.csdn.net/guolin_blog/article/details/51763825


状态栏的使用:http://blog.csdn.net/ruancoder/article/details/54571720



原创粉丝点击