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

Posted

技术标签:

【中文标题】当用户在其他地方交互时如何关闭 Snackbar?【英文标题】:How to dismiss a Snackbar when user interact elsewhere? 【发布时间】:2016-07-06 09:19:01 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

可能会在 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 的 cmets 对此进行了改进。 (我还没有测试过这个经过稍微修改的新版本)。

【讨论】:

不需要更新'mSnackbarShown',可以使用SnackBar的isShown方法,这样就不需要设置回调,只有dispatchTouchEvent有效。 您应该使用 getGlobalVisibleRect() 而不是 getHitRect()。你也是“mSnackBar == null”上的一个错字。 修正错字谢谢。为什么 getGlobalVisibleRect 更好?我实际上从其他地方复制了 getHitRect() 位,所以真的不知道什么更好。【参考方案2】:

作为您在问题状态中提供的指南:

或其他地方的用户交互(例如召唤新的表面或活动)

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

换句话说,只要用户保持在同一个活动上,小吃栏就应该在超时后自行消失,或者如果用户故意将其滑掉。

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

【讨论】:

它清楚地写着“比如……”,不仅是召唤一个新的活动,而且点击、滚动、离开等都是用户交互和 Gmail 应用程序立即关闭小吃栏(在超时之前)如果您滚动或单击屏幕上的任何位置。

以上是关于当用户在其他地方交互时如何关闭 Snackbar?的主要内容,如果未能解决你的问题,请参考以下文章

当用户执行任何操作时如何关闭 Snackbar?

Android Snackbar 的使用

如何在关闭屏幕时关闭打开的 SnackBar?

autoHideDuration 在使用钩子的 Snackbar 中不起作用[关闭]

无法更改snackBar中变量的值[关闭]

关于SnackBar被键盘挡住的解决方案