首次触摸事件后如何隐藏状态和导航栏?

时间:2015-08-25 21:17:26

标签: android show-hide android-statusbar

我一直在使用标记SYSTEM_UI_FLAG_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION隐藏并显示状态和导航栏。他们工作正常。我在活动开始时隐藏它们,我想在触摸事件中再次显示它们。 Android会在第一次触摸事件时自动显示它们(此第一个触摸事件未传递到我的应用程序)。我想在一段时间后使用sendMessageDelayed()隐藏两个栏。我怎么能用这个第一次触摸事件?

2 个答案:

答案 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.LayoutParamsImmersive 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

相关问题