当用户在其他地方交互时如何关闭 Snackbar?

How to dismiss a Snackbar when user interact elsewhere?

如何在用户与其他地方交互时关闭 Snackbar,例如 Gmail 应用程序在用户滚动、点击其他地方、离开 activity 等时关闭 Snackbar 的方式。

Material Design中也提到了这种行为:

正如您在问题中提供的指南所述:

or user interaction elsewhere (such as summoning a new surface or activity)

它没有提及显示快餐栏时有关滑动或点击的任何内容。

换句话说,只要用户保持原样 activity 快餐栏应该在超时后自行消失,或者如果用户故意将其滑动关闭。

此外,我检查了 Google 的 Gmail 应用程序,如果用户在同一屏幕上滑动,快餐栏不会消失。

可能会覆盖 Activity 中的 dispatchTouchEvent

private Snackbar mSnackbar;

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        if (mSnackbar != null && mSnackbar.isShown()) {

                Rect sRect = new Rect();
                mSnackbar.getView().getHitRect(sRect);

                //This way the snackbar will only be dismissed if
                //the user clicks outside it.
                if (!sRect.contains((int)ev.getX(), (int)ev.getY())) {
                    mSnackbar.dismiss();
                    mSnackbar == null;
                }
        }
    }

    return super.dispatchTouchEvent(ev);
}

感谢 Eme 和 gicci 的评论对此进行了改进。 (我还没有测试过这个稍微编辑过的新版本)。