-如果你想隐藏导航栏,你会遇到第一次触摸事件的问题,你的应用将无法对它做任何事情。
-如果你愿意,可以在一定时间后使用postDelayed() 隐藏栏,这是我所做的:
Runnable navHider = new Runnable() {
@Override
public void run() {
Log.e("HIDING", "hide");
hideSystemUi();
}
/** Hides StatusBar and NavigationBar */
private void hideSystemUi() {
if (isLandscape()) {
// Set flags for hiding status bar and navigation bar
View decorView = ((Activity) context).getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
}
}
private void setVisibilityChangeListener() {
View decorView = ((Activity) context).getWindow().getDecorView();
decorView
.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
// Note that system bars will only be "visible" if none
// of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are
// set.
if (isLandscape()) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
getHandler().postDelayed(navHider,
UI_VISIBILITY_TIME);
}
}
}
});
}
我们在这里做的是:
-首先,navHider 是一个 Runnable 对象,它隐藏了 systemUI。
-其次,hideSystemUi方法是设置隐藏状态和导航栏的UI选项标志(注意我们也使用LAYOUT_STABLE标志,所以内容会出现在状态栏和导航栏后面,我们不会需要调整内容的大小。)
-第三,我们使用systemUIVisibilityChangeListener,这样用户与屏幕交互后,状态栏和导航栏显示出来,我们使用postDelayed(),这里UIVisibility时间就是时间,你要等待在我们隐藏状态和导航栏之前
您还可以在每个触摸事件(或单击按钮等)上显示/隐藏状态栏我们只能对状态栏执行此操作,但不能对导航栏执行此操作:
/** Hides StatusBar and NavigationBar */
private void hideSystemUi() {
if (isLandscape()) {
// Set flags for hiding status bar and navigation bar
View decorView = ((Activity) context).getWindow().getDecorView();
// // Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
Window window = ((Activity) context).getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
((Activity) context).getActionBar().hide();
isShowing = false;
}
}
private void showSystemUi() {
View decorView = ((Activity) context).getWindow().getDecorView();
Window window = ((Activity) context).getWindow();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
((Activity) context).getActionBar().show();
isShowing = true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (isShowing) {
Log.e("onInterceptTouchEvent", "Hiding System UI");
hideSystemUi();
} else {
Log.e("onInterceptTouchEvent", "Showing System UI");
showSystemUi();
}
}
return super.onInterceptTouchEvent(event);
}
请注意,在这两种方法中:hideSystemUI() 和 showSystemUI(),为了避免烦人的“第一次触摸事件”,我们使用旧的 4.0 之前的标志来隐藏状态栏。
我在我的ViewPager(我用来显示图像)中使用此代码,所以我可以覆盖onInterceptTouchEvent() 方法。在这里,我用一个简单的布尔值检查系统是否显示。另外您需要使用MotionEvent.ACTION_UP,这将允许您滚动ViewPager,而不会意外显示/隐藏状态栏,因此您可以在全屏模式下滚动。
您可以做一个自定义布局(比如说RelativeLayout),它扩展ViewGroup,您可以覆盖onInterceptTouchEvent 并进行此实现。触摸事件仅适用于该CustomRelativeLayout,因此如果您希望它适用于整个活动,只需将CustomRelativeLayout 设置为您的基本布局,并使用match_parent 属性作为高度/宽度。
这里是显示和隐藏状态和导航栏的信息。
https://developer.android.com/training/system-ui/status.html
https://developer.android.com/training/system-ui/navigation.html
这是一个链接,用于管理触摸事件。
https://developer.android.com/training/gestures/viewgroup.html