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

Как я могу получать уведомления о том, что Snackbar уволился?

Я использую Snackbar из библиотеки com.android.support:design:22.2.0. Я использую его для отмены удаления. Чтобы облегчить мою жизнь, я собираюсь сделать UI похожим на то, что вещи фактически удалены из источника данных, и если кнопка отмены в снэке не нажата, на самом деле выполните удаления из источника данных. Итак, я хочу знать, когда Snackbar больше не виден, поэтому безопасно удалять элементы.

Я могу вызвать getView() в Snackbar, но я не уверен, какой прослушиватель я должен использовать. Я попробовал setOnSystemUiVisibilityChangeListener(), но это не сработало, я считаю, что это только для строки состояния системы.

Кроме того, Snackbar не может быть расширен, поскольку у него есть частный конструктор.

4b9b3361

Ответ 1

Библиотека дизайна Google поддерживает обратные вызовы Snackbar в версии 23. См. Документы закуски и Обратные вызовы. Затем вы получите уведомление о том, что Snackbar будет уволен (а также когда он показан), а также тип увольнения, если это вам полезно:

snackbar.addCallback(new Snackbar.Callback() {

    @Override
    public void onDismissed(Snackbar snackbar, int event) {
      //see Snackbar.Callback docs for event details
      ...  
    }

    @Override
    public void onShown(Snackbar snackbar) {
       ...
    }
  });

Ответ 2

    snackbar.setCallback(new Snackbar.Callback() {

        @Override
        public void onDismissed(Snackbar snackbar, int event) {
            if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
                // Snackbar closed on its own
            }
        }

        @Override
        public void onShown(Snackbar snackbar) {
            ...
        }
    });

Ответ 3

Недавно я наткнулся на этот вопрос сам, когда для прокрутки и показа Снежки, слишком много было показано, пока первый даже не исчез. Мне нужно было найти способ узнать, должно ли приложение заложить закусочную.

Я лично нашел это решение.

Правда, Snackbar сам не предлагает никакого слушателя для его состояния/видимости, но вы все равно можете получить объект View из Snackbar (getView();). Из объекта View вы можете использовать самые разные методы для добавления слушателей.

Чтобы реализовать это, вы должны выйти из общего использования "To-To-One-Line" в режиме "все в одной строке", потому что добавление слушателей возвращает void.

Я лично нашел OnAttachStateChangeListener для удовлетворения моих потребностей.

Отбросьте блокпинг с моим кодом, если он может оказаться полезным для вас.

Snackbar snack = Snackbar.make(getView(), "My Placeholder Text", Snackbar.LENGTH_LONG);

snack.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
    @Override
        public void onViewAttachedToWindow(View v) {
            canDisplaySnackbar = false;
        }

    @Override
    public void onViewDetachedFromWindow(View v) {

        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            @Override
            public void run() {
                canDisplaySnackbar = true;

                }
        }, 1000);
    }
});
snack.show();

Обратите внимание, что это только моя реализация для моей собственной проблемы, Handler с postDelayed Runnable может даже не соответствовать вашему делу. Это было просто дать общее представление о реализации, которую я предложил использовать уже имеющийся фрагмент.

Ответ 4

Чтобы получать уведомления о том, что snackbar был показан или отклонен, вы можете предоставить Snackbar.Callback через setCallback (обратный вызов).

Ответ 5

В настоящее время нет способа получить уведомление при завершении отображения Snackbar.

В этом потоке обходной путь обсуждается на основе таймера на протяжении всего экрана Snackbar. Закуска в библиотеке поддержки не включает OnDismissListener()?

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

Ответ 7

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

event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT

А теперь новый код выглядит так, как показано ниже.

final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG);

snackbar.addCallback(new Snackbar.Callback() {

@Override
public void onDismissed(Snackbar snackbar, int event) {
 if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
        // Snackbar closed on its own
    }  
}

@Override
public void onShown(Snackbar snackbar) {
...
}
});
snackBar.show();

Ответ 8

В настоящее время вы не можете этого достичь.

У вас нет прослушивателя, когда снэкбар сжимается.

Самый простой способ сделать это - временно сохранить запись в другом месте (даже локальную переменную), а затем повторно вставить ее, если они попадут в кнопку отмены.

Ответ 9

    snackbar.addCallback(new Snackbar.Callback() {
        public void onShown(Snackbar snackbar) {
           //  on show  
        }
 public void onDismissed(Snackbar snackbar, int event) {
          //  on dismiss  
        }
      });

Ответ 10

val snackBar = Snackbar
                .make(view, "Text Snackbar", Snackbar.LENGTH_LONG)
                .addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
                    override fun onShown(transientBottomBar: Snackbar?) {
                        super.onShown(transientBottomBar)
                    }

                    override fun onDismissed(transientBottomBar: Snackbar?, event: Int) {
                        super.onDismissed(transientBottomBar, event)
                    }
                })

        val snackBarView = snackBar.view
        snackBarView.setBackgroundColor(Color.RED)
        snackBar.show()