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

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

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

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

Solutions Collecting From Web of "Как я могу получать уведомления о том, что Snackbar уволился?"

Библиотека дизайна Google поддерживает обратные вызовы Snackbar в версии 23. См. Документы Snackbar и Документы обратного вызова . Затем вы получите уведомление, когда 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) { ... } }); 

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

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

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

Чтобы реализовать это, вы должны выйти из общего использования «все в одной строке» Toast / Snackbar, потому что добавление слушателей возвращает 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 может даже не соответствовать вашему делу. Это было просто дать общее представление о реализации, которую я предложил использовать уже имеющийся у меня фрагмент.

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

  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) { ... } }); 

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

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

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

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

При прослушивании закуски не слышен слушатель.

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