Подтвердить что ты не робот

Как отклонить 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).

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

4b9b3361

Ответ 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)