Как я могу получать уведомления о том, что Snackbar уволился?
Я использую Snackbar из библиотеки com.android.support:design:22.2.0
. Я использую его для отмены удаления. Чтобы облегчить мою жизнь, я собираюсь сделать UI похожим на то, что вещи фактически удалены из источника данных, и если кнопка отмены в снэке не нажата, на самом деле выполните удаления из источника данных. Итак, я хочу знать, когда Snackbar больше не виден, поэтому безопасно удалять элементы.
Я могу вызвать getView() в Snackbar, но я не уверен, какой прослушиватель я должен использовать. Я попробовал setOnSystemUiVisibilityChangeListener()
, но это не сработало, я считаю, что это только для строки состояния системы.
Кроме того, Snackbar не может быть расширен, поскольку у него есть частный конструктор.
Ответы
Ответ 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 говорит, что это произойдет, если отображается не связанный диалог или всплывающее окно.
Ответ 6
setCallback
теперь устарел и addCallback
следует использовать
https://developer.android.com/reference/android/support/design/widget/BaseTransientBottomBar.html#addCallback(android.support.design.widget.BaseTransientBottomBar.BaseCallback)
Ответ 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()