Библиотека поддержки дизайна 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).
Однако, похоже, нет никакой доступной функции, которая могла бы это сделать.
Snackbar
является нарушением рекомендаций Google по дизайну материалов .Ответы:
Для Java
.make
Метод возвращаетSnackbar
объект. Сохраните экземпляр этого объекта, создав егоfinal
. ЗатемonClick()
позвоните в.dismiss
:final Snackbar snackBar = Snackbar.make(findViewById(android.R.id.content), "Snackbar Message", Snackbar.LENGTH_LONG); snackBar.setAction("Action Message", new View.OnClickListener() { @Override public void onClick(View v) { // Call your action method here snackBar.dismiss(); } }); snackBar.show();
Для Котлина,
Snackbar.make( findViewById(android.R.id.content), "Snackbar Message", Snackbar.LENGTH_INDEFINITE ).setAction("Action Message") { // Call action functions here }.show()
источник
OnClickListener
будетnull
Реализуйте действие щелчка и оставьте его пустым. Щелчок по пустому действию щелчка закроет снэк-бар.
Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG) .setAction("DISMISS", new View.OnClickListener() { @Override public void onClick(View v) { } }) .show();
источник
null
за слушателя, нет необходимости создавать реальный экземплярКогда вы используете,
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
источник
Это старый вопрос, но я просто хочу поделиться своим опытом использования аналогичной функции на Snackbar. Итак, у нас есть дизайн для нашего приложения, в котором закусочная должна отображаться на неопределенное время, и пользователь должен иметь возможность ее закрыть ... но внутри нее не должно быть кнопки DISMISS (Google в любом случае не рекомендует Dismiss или Cancel внутри закусочных). Наш буфет нужно было закрыть, просто нажав на него.
Единственное решение, сработавшее для нас, было в итоге (я использую здесь retrolambda, но можно использовать и стандартный View.OnClickListener):
final Snackbar snack = ... /* create proper snackbar as alway */ snack.getView().setOnClickListener(v -> snack.dismiss());
Обратите внимание на вызов getView () посередине.
источник
Snackbar (от 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();
Типы увольнения Snackbar:
/** 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)
источник
У меня такая же проблема. Когда я использовал .dismiss (), анимация выглядела иначе, и возникли две проблемы:
Заглянув в исходный код 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 для Snackbar: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java
источник