Как отклонить Snackbar, используя его собственную кнопку Action?
Поддержка поддержки дизайна 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).
Однако не существует какой-либо функции, которая может это сделать.
Ответы
Ответ 1
Для 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()
Ответ 2
Реализуйте действие щелчка и дайте ему опустеть. Нажатие на пустое действие щелчка приведет к отключению закусочной.
Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG)
.setAction("DISMISS", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
Ответ 3
Когда вы используете 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
Ответ 4
Это старый вопрос, но я просто хочу поделиться своим собственным опытом в отношении подобной функции на Snackbar. Таким образом, мы разработали дизайн для нашего приложения, так что снэк-бар должен показываться бесконечно, и пользователь должен иметь возможность отклонить его... но в нем не должно быть кнопки DISMISS (Google в любом случае не рекомендует отменять или отменять действия внутри снэк-баров). Нашу закусочную пришлось закрыть, просто нажав на нее.
Единственное решение, работавшее для нас, было в конце (я использую retrolambda здесь, но стандартный View.OnClickListener также может быть использован):
final Snackbar snack = ... /* create proper snackbar as alway */
snack.getView().setOnClickListener(v -> snack.dismiss());
Обратите внимание на вызов getView() посередине.
Ответ 5
У меня была та же проблема. Когда я использовал .dismiss(), анимация выглядела по-другому и возникли две проблемы:
- FAB не спускается снова
- сам 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
Ответ 6
Закусочная (от '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;
P.S. В примере кода используются лямбда-выражения (by RetroLambda)