Как закрыть Snackbar, когда пользователь взаимодействует в другом месте?

Как закрыть Snackbar, когда пользователь взаимодействует в другом месте, например, как приложение Gmail отклоняет Snackbar, когда пользователь прокручивает, щелкает в другом месте, покидает действие и т. д.

Это поведение также было упомянуто в Material Design< /а>:

введите здесь описание изображения


person Hafez Divandari    schedule 19.03.2016    source источник


Ответы (2)


Возможно, переопределить dispatchTouchEvent в Activity.

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 за улучшение этого. (Я не тестировал эту новую слегка отредактированную версию).

person joe_deniable    schedule 05.06.2016
comment
Вам не нужно обновлять 'mSnackbarShown', вы можете использовать метод isShown SnackBar, таким образом, вам не нужно устанавливать обратный вызов, только с допустимым dispatchTouchEvent. - person Eme; 21.11.2017
comment
Вы должны использовать getGlobalVisibleRect() вместо getHitRect(). Это также опечатка в mSnackBar == null. - person gicci; 01.03.2021
comment
исправили опечатку спасибо. почему getGlobalVisibleRect лучше? На самом деле я скопировал бит getHitRect() откуда-то еще, поэтому не знаю, что лучше. - person joe_deniable; 02.03.2021

Как указано в рекомендациях, которые вы указали в своем вопросе:

или взаимодействие с пользователем в другом месте (например, вызов новой поверхности или действие)

В нем ничего не говорится о смахиваниях или щелчках во время отображения закусочной.

Другими словами, пока пользователь остается в одном и том же действии, закусочная должна просто исчезнуть сама по себе после тайм-аута или если пользователь умышленно смахивает ее.

Кроме того, я проверил приложение Gmail от Google, и закусочные не исчезают, если пользователь проводит пальцем по тому же экрану.

person Mor Paz    schedule 19.03.2016
comment
В нем четко сказано, что, например..., не только вызов нового действия, но и щелчок, прокрутка, уход и т. д. являются взаимодействиями с пользователем, а приложение Gmail немедленно отклоняет панели закусок (до истечения времени ожидания), если вы прокручиваете или щелкаете в любом месте на экране. - person Hafez Divandari; 20.03.2016