目前实现的android高版本沉浸式状态栏分为两类:
1、是纯透明状态栏;
2、是纯透明状态栏,但是状态栏字体是黑色;
将状态栏的代码封装到BaseActivity中更方便使用:
BaseActivity:
public abstract class BaseActivity extends AppCompatActivity {BaseActivity baseActivity;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {setTransparent();super.onCreate(savedInstanceState);getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);setContentView(initLayout());initView(savedInstanceState);setTabBar(setBarColor());initData();baseActivity = this;}private void setTransparent() {if (Build.VERSION.SDK_INT >= 21) {int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;getWindow().getDecorView().setSystemUiVisibility(option);getWindow().setStatusBarColor(Color.TRANSPARENT);} else if (Build.VERSION.SDK_INT >= 19) {//4.4全透明WindowManager.LayoutParams params = getWindow().getAttributes();params.flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | params.flags;}}protected abstract int setBarColor();void setTabBar(int type) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {if (type == 1) {//纯透明黑字StatusBarLightMode(this);} else {//黑底白字SystemBarTintManager tintManager = new SystemBarTintManager(this);tintManager.setStatusBarTintEnabled(true);tintManager.setStatusBarTintResource(R.color.white);//通知栏所需颜色}}}/*** 设置状态栏黑色字体* 适配4.4以上版本MIUI、Flyme和6.0以上版本其他Android** @param activity activity* @return 1:MIUUI 2:Flyme 3:android6.0*/public static int StatusBarLightMode(Activity activity) {int result = 0;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) {result = 2;} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);result = 3;}}return result;}/*** @param window 需要设置的窗口* @param dark 是否把状态栏字体及图标颜色设置为深色* @return boolean 成功执行返回true*/private static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) {boolean result = false;if (window != null) {try {WindowManager.LayoutParams lp = window.getAttributes();Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");darkFlag.setAccessible(true);meizuFlags.setAccessible(true);int bit = darkFlag.getInt(null);int value = meizuFlags.getInt(lp);if (dark) {value |= bit;} else {value &= ~bit;}meizuFlags.setInt(lp, value);window.setAttributes(lp);result = true;} catch (Exception e) {result = false;}}return result;}//设置布局protected abstract int initLayout();protected abstract void initView(Bundle savedInstanceState);//初始化数据protected abstract void initData();
}
正常Activity继承之后重写 setBarColor 方法返回1就行,需要注意的是,这个方法需要在AndroidManifest方法里面将theme改成hideAppTheme;
hideAppTheme:
<!-- Base application theme. --><style name="HideAppTheme" parent="Theme.AppCompat.Light.DarkActionBar">//这两个语句就是设置隐藏标题栏的语句<item name="windowActionBar">false</item><item name="windowNoTitle">true</item></style>
然后就可以直接使用了,效果图如下: