Android狀態列一體化/沉浸/透明
阿新 • • 發佈:2018-12-13
一.首先來看一下實現後的效果:
例一:
例二:
二.上乾貨
為了有些同學需要應急,直接給出使用步驟
-
首先拷貝兩個工具類到專案中:
NewStatusBarUtil
OldStatusBarUtil
分別支援4.4和4.4以上版本。
其次在BaseActivity中新增一個方法:protected void process() { // 華為,OPPO機型在StatusBarUtil.setLightStatusBar後佈局被頂到狀態列上去了 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 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);
}
}
四.分析
待續