1、網絡上關於隱藏StatusBar的方案很多,這裏不再贅述,提供一個常見方式在activity下:
// 隱藏狀態欄
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
2、一些手機比如華爲的機子,大多都有虛擬按鍵即navigationbar,關於隱藏NavigationBar,網絡上大多數的做法是設置一個flag,如下:
View decorView = getWindow().getDecorView();
decorView .setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
*這是最簡單的隱藏方式,大多數應用中能夠達到效果,但是很坑的是當你從邊緣上滑的時候,導航欄就出來了,google明確說明這個動作是不能攔截的。
3、所以很多人想能不能在上面蓋一層view,把事件攔截了,不讓導航欄彈出來,不過由於view的級別不夠,導航欄還是不緊不慢的彈出,後來偶然發現了系統錯誤彈窗能位於Window的最上方覆蓋一切,且不會攔截觸摸或點擊事件,於是給view設置了這個flag,覆蓋上這個view之後把導航欄隱藏,試了試下面的代碼搞定了:
*
private void hideNavigationBar() {
int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION//隱藏Navigation Bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;//防止Navigation Bar在覆蓋view的情況下上彈
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.my_view, null);
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("rocky", "Hi....");
return false;
}
});
WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
int width = windowManager.getDefaultDisplay().getWidth();
int height = windowManager.getDefaultDisplay().getHeight();
WindowManager.LayoutParams params = new WindowManager.LayoutParams(width, height,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //讓window佔滿整個手機屏幕,不留任何邊界(border)
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.y = 0;
params.x = 0;
windowManager.addView(view, params);
view.setSystemUiVisibility(flags);
}