Как отклонить Snackbar, используя собственную кнопку действия?

Библиотека поддержки дизайна Android теперь включает поддержку Snackbar.

Я использовал следующий код для его создания:

Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG) .setAction("Dismiss", new View.OnClickListener() { @Override public void onClick(View v) { } }).show(); 

Снэкбару можно убрать с помощью салфетки. Тем не менее, я также хочу отклонить его, используя свою собственную кнопку действий (созданную с помощью функции setAction).

Однако, похоже, не существует какой-либо функции, которая может это сделать.

Solutions Collecting From Web of "Как отклонить Snackbar, используя собственную кнопку действия?"

Метод .make возвращает объект Snackbar . Сохраните экземпляр этого объекта, сделав его final . Затем в onClick() вызовите .dismiss :

 final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG); snackBar.setAction("Dismiss", new View.OnClickListener() { @Override public void onClick(View v) { snackBar.dismiss(); } }); snackBar.show(); 

Внедрите действие click и пусть оно будет пустым. При нажатии на пустое действие клика будет отменена закуска.

 Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG) .setAction("DISMISS", new View.OnClickListener() { @Override public void onClick(View v) { } }) .show(); 

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

  Snackbar snackbar = Snackbar.make(relativeLayout, "Your Message", Snackbar.LENGTH_INDEFINITE); snackbar.setAction("dismiss", new View.OnClickListener() { @Override public void onClick(View v) { snackbar.dismiss(); } }); snackbar.show(); 

Будьте осторожны :

 Snackbar.LENGTH_INDEFINITE 

Закусочная (от «com.android.support:design:23.2.1» ) поддерживает множество видов действий по увольнению. Вы можете создать простой фильтр, используя событие , например, в этом примере:

 Snackbar.make(view, wornMessage, Snackbar.LENGTH_LONG).setActionTextColor(context.getResources().getColor(R.color.primary)) .setCallback(new Snackbar.Callback() { @Override public void onShown(Snackbar snackbar) { super.onShown(snackbar); // when snackbar is showing } @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); if (event != DISMISS_EVENT_ACTION) { //will be true if user not click on Action button (for example: manual dismiss, dismiss by swipe } } }) .setAction("Undo, view1 -> { // if user click on Action button }).show(); 

Виды смежных закусок:

 /** Indicates that the Snackbar was dismissed via a swipe.*/ public static final int DISMISS_EVENT_SWIPE = 0; /** Indicates that the Snackbar was dismissed via an action click.*/ public static final int DISMISS_EVENT_ACTION = 1; /** Indicates that the Snackbar was dismissed via a timeout.*/ public static final int DISMISS_EVENT_TIMEOUT = 2; /** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/ public static final int DISMISS_EVENT_MANUAL = 3; /** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/ public static final int DISMISS_EVENT_CONSECUTIVE = 4; 

PS В примере кода используются лямбда-выражения (по RetroLambda)

Это старый вопрос, но я просто хочу поделиться своим опытом вокруг подобной функции на Snackbar. Таким образом, у нас есть дизайн для нашего приложения, эта закусочная должна отображаться на неопределенный срок, и пользователь должен уметь ее отклонять .. но внутри нее не должно быть кнопки DISMISS (Google не рекомендует в любом случае отменить действие «Отклонить» или «Отменить действия внутри snackbars»). Наша закусочная должна была быть уволена, просто нажав на нее.

Единственное решение, работающее для нас, было в конце (я использую retrolambda здесь, но также можно использовать стандартный View.OnClickListener):

 final Snackbar snack = ... /* create proper snackbar as alway */ snack.getView().setOnClickListener(v -> snack.dismiss()); 

Обратите внимание, что getView () вызывает в середине;) Надеюсь, это может помочь кому-то, когда-нибудь 🙂

С наилучшими пожеланиями,

Дарек

У меня такая же проблема. Когда я использовал .dismiss (), анимация выглядела по-другому, и было две проблемы:

  1. FAB снова не падает
  2. Сам SnackBar не скользит вниз, как на Click

Заглянув в исходный исходный код Android для Snackbar, я нашел следующее решение:

 View snackbarView = snackbar.getView(); Button snackbarActionButton = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action); //snackbarActionButton.setSoundEffectsEnabled(false); // might be considered in order not to have a confusing sound because nothing was clicked by the user 

Тогда я бы назвал .performClick на snackBarActionButton

 snackBarActionButton.performClick(); 

Ссылка на исходный код Android для закуски: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java