我一直在使用标记SYSTEM_UI_FLAG_FULLSCREEN
和SYSTEM_UI_FLAG_HIDE_NAVIGATION
隐藏并显示状态和导航栏。他们工作正常。我在活动开始时隐藏它们,我想在触摸事件中再次显示它们。 Android会在第一次触摸事件时自动显示它们(此第一个触摸事件未传递到我的应用程序)。我想在一段时间后使用sendMessageDelayed()
隐藏两个栏。我怎么能用这个第一次触摸事件?
答案 0 :(得分:4)
我使用View.OnSystemUiVisibilityChangeListener
得到了它。当状态和导航栏都可见时,我在if条件中使用了Handler.sendMessageDelayed
。为清晰起见,请参阅以下实施。
来源:Responding to UI Visibility Changes
View decorView = getActivity().getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
// TODO: The system bars are visible. Make any desired
Message msg = mHandler.obtainMessage(HIDE_STATUSBAR); //Implement your hide functionality accordingly
mHandler.sendMessageDelayed(msg, 3000);
} else {
// TODO: The system bars are NOT visible. Make any desired
}
}
}
});
此方法的缺点是您的应用无法使用第一个触摸事件。我认为在这种情况下你必须使用其他方法,例如WindowManager.LayoutParams或Immersive Fullscreen Mode。
答案 1 :(得分:0)
- 如果您想要隐藏导航栏,您将遇到第一次触摸事件的问题,您的应用将无法使用它做任何事情。
- 如果你想要,你可以使用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
是一个隐藏systemUI的Runnable对象。
- 第二,hideSystemUi
方法设置用于隐藏状态和导航栏的UI选项标志(注意我们也使用LAYOUT_STABLE
Flag,因此内容将显示在状态栏和导航后面酒吧,我们不需要调整内容的大小。)
- 第三,我们正在使用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()
,以避免烦人的第一次触摸事件"我们使用旧的pre 4.0标志来隐藏状态栏。
我在ViewPager
(我用来显示图片)中使用此代码,因此我可以覆盖onInterceptTouchEvent()
方法。在这里,我用一个简单的布尔值检查系统是否显示。此外,您还需要使用MotionEvent.ACTION_UP
,这样您就可以滚动ViewPager
,而不会意外地显示/隐藏状态栏,因此您可以在全屏模式下滚动。
您可以做的是制作一个自定义布局(让我们说RelativeLayout
),扩展ViewGroup
,您可以覆盖onInterceptTouchEvent
并进行此实施。触摸事件仅适用于CustomRelativeLayout
,因此如果您希望它可以处理整个活动,只需使用CustomRelativeLayout
高度/宽度的match_parent
属性设置Sub GetCustomFieldNames()
Dim TextFields As Variant
TextFields = Array(188743731, 188743734, 188743737, 188743740, 188743743 _
, 188743746, 188743747, 188743748, 188743749, 188743750, 188743997, 188743998 _
, 188743999, 188744000, 188744001, 188744002, 188744003, 188744004, 188744005 _
, 188744006, 188744007, 188744008, 188744009, 188744010, 188744011, 188744012 _
, 188744013, 188744014, 188744015, 188744016)
Dim FldID As Variant
For Each FldID In TextFields
If Len(CustomFieldGetName(FldID)) > 0 Then
Debug.Print FieldConstantToFieldName(FldID), CustomFieldGetName(FldID)
End If
Next FldID
End Sub
基础布局。
以下是显示和隐藏状态和导航栏的信息。 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