一.首先来看一下实现后的效果:
例一:
例二:
二.上干货
为了有些同学需要应急,直接给出使用步骤
-
首先拷贝两个工具类到项目中:
StatusBarUtil
OldStatusBarUtil
分别支持4.4和4.4以上版本。
其次在BaseActivity中添加一个方法:protected void process() { View content = ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0); if (content != null) { content.setFitsSystemWindows(true); } }
-
在Activity中的使用:
setContentView()前调用方法:StatusBarUtil.transparencyBar(this);
在setContentView()后调用方法:
process();
在onStart()方法中调用:
@Override protected void onStart() { super.onStart(); StatusBarUtil.setStatusBarColor(this,R.color.white);//设置状态栏颜色和顶部布局背景色一致 StatusBarUtil.setStatusBarTextColor(this,true); }
在activity中的使用就完成了。
-
在fragment中使用:
首先在所在activity中同样
setContentView()前调用方法:StatusBarUtil.transparencyBar(this);
在setContentView()后调用方法:
process();
在fragment的onCreate中:
StatusBarUtil.setStatusBarColor(getActivity(),R.color.app_base_color); StatusBarUtil.setStatusBarTextColor(getActivity(),false);
在fragment的onHiddenChanged方法中:
@Override public void onHiddenChanged(boolean hidden) {//为了保证切换fragment时重置状态栏颜色 super.onHiddenChanged(hidden); if(!hidden){ StatusBarUtil.setStatusBarColor(getActivity(),R.color.app_base_color); StatusBarUtil.setStatusBarTextColor(getActivity(),false); } }
在fragment中的使用就完成了。
三.错误案例
- 错误例图:
错误原因:
if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
setContentView(R.layout.activity_patient_info);
正确的应该是区分api19和21如下:
StatusBarUtil.transparencyBar(this);
setContentView(R.layout.activity_home_page);
/**
* 修改状态栏为全透明
* @param activity
*/
@TargetApi(19)
public static void transparencyBar(Activity activity){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
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(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window =activity.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
- vivo兼容性处理
由于vivo手机系统源码未公开,无法对其做兼容性处理,造成其状态栏字体颜色只能为白色,在白色背景下就会看不到。
错误例图:
处理方法修改方法:
/**
* 修改状态栏为全透明
*/
@TargetApi(19)
public static void transparencyBar(Activity activity) {
//如果手机品牌为vivo或oppo则采用此种方案
if ("vivo".equals(android.os.Build.BRAND) || "oppo".equals(android.os.Build.BRAND)) {
Window window = activity.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
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(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = activity.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
}
}
效果:
四.分析
待续