状态栏使用详解

来源:互联网 发布:淘宝男装 编辑:程序博客网 时间:2024/06/15 08:50

在SDK21以后,系统为我们提供了修改状态栏的方法,有时候我们需要类似全屏状态,但是还要显示状态栏,这时候我们需要把状态栏背景颜色设置为全屏;有时候我们需要状态栏颜色与activity上边title颜色保持一致,如果状态栏是白色的,我们还需要修改状态栏中图标的颜色。
首先做一个判断
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
然后在你的activity的XML文件中设置

  android:fitsSystemWindows="true"

//因为下面的方法都会通过setSystemUiVisibility方法设置为全屏同时状态栏不会被覆盖掉,如果不设置这个,会遮盖掉部分布局。

下面就是设置你的状态栏的代码:
其中setStatusBarColor是设置状态栏的颜色
method.invoke是设置状态栏的图标的颜色

Window window=mainActivity.getWindow();        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);        window.setStatusBarColor(getColor(R.color.colorBackground));        Class clazz = window.getClass();        try {            Method method= clazz.getMethod("setStatusBarIconColor", int.class);            method.invoke(window, Color.BLACK);        } catch (NoSuchMethodException e) {            e.printStackTrace();        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (IllegalArgumentException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }

同时讲解一下setSystemUiVisibility中的设置的状态的意思:

  1. View.SYSTEM_UI_FLAG_VISIBLE:显示状态栏,Activity不全屏显示(恢复到有状态的正常情况)。    2. View.INVISIBLE:隐藏状态栏,同时Activity会伸展全屏显示。    3. View.SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。    4. View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。    5. View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN    6. View.SYSTEM_UI_LAYOUT_FLAGS:效果同View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN    7. View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键。    8. View.SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low profile模式),状态栏上一些图标显示会被隐藏。// SYSTEM_UI_FLAG_LAYOUT_STABLE:防止系统栏隐藏时内容区域大小发生变化

PS:补充一下,小米手机的状态栏需要单独适配,这里直接贴出适配方案。
因为状态栏一般默认主题是白色的,这里的效果是灰色背景和黑色字体,如果需要别的颜色的背景的话,可以在后面通过上面的方法单独设置。

public void setStatusBarDarkMode(boolean darkmode, Activity activity) {        Class<? extends Window> clazz = activity.getWindow().getClass();        try {        int darkModeFlag = 0;        Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");        Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");        darkModeFlag = field.getInt(layoutParams);        Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);        extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);        if(darkmode){            Window window = getWindow();            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);        }else{            int flag = activity.getWindow().getDecorView().getSystemUiVisibility()             & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;            window.getDecorView().setSystemUiVisibility(flag);​        }        } catch (Exception e) {            e.printStackTrace();        }}
原创粉丝点击