Когда используется Snackbar isQueued ()? (Как поставить в очередь закусочную)

Если я вызову snackbar несколько раз подряд, отобразится только последний элемент snackbar.

Например, с кодами ниже, будет показан только пункт 3. Кажется, что Snackbar.LENGTH_LONG игнорируется (и устанавливается равным нулю?) Для пунктов 1 и 2.

Snackbar.make(view, "Item 1", Snackbar.LENGTH_LONG).show(); Snackbar.make(view, "Item 2", Snackbar.LENGTH_LONG).show(); Snackbar.make(view, "Item 3", Snackbar.LENGTH_LONG).show(); 

Но в документах Google я вижу, что можно отправлять сообщения в очередь.

 public boolean isShownOrQueued () Returns whether this Snackbar is currently being shown, or is queued to be shown next. 

Так как мы фактически ставим в очередь закусочную?

Вот частичный фрагмент, который решает вашу проблему, хотя это может и не быть правильным способом:

 //using a queue to pass string to the snackbar Queue<String> myQueue = new LinkedList<String>(); myQueue.offer("item 1"); myQueue.offer("item 2"); myQueue.offer("item 3"); displaysnack(myQueue, view); public void displaysnack(final Queue dQueue, final View view){ Snackbar.make(view, (String)dQueue.poll(), Snackbar.LENGTH_LONG).setCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { switch (event) { case Snackbar.Callback.DISMISS_EVENT_ACTION: Toast.makeText(getApplicationContext(), "Clicked the action", Toast.LENGTH_LONG).show(); break; //once the timeout expires, display the next one in the queue. case Snackbar.Callback.DISMISS_EVENT_TIMEOUT: Toast.makeText(getApplicationContext(), "Showing: "+ (dQueue.size()), Toast.LENGTH_SHORT).show(); if (dQueue.size()>0){displaysnack(dQueue, view);} break; case Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE: //Toast.makeText(getApplicationContext(), "Multiple Shown", Toast.LENGTH_SHORT).show(); break; } } 

Мне также нужно было реализовать очередь snackbars, но не нашел готового решения. Поэтому я решил реализовать это самостоятельно. Вы можете попробовать https://github.com/AntonyGolovin/FluentSnackbar .

Просто вызовите important() в Builder, и он будет добавлен в очередь.

Я тоже встретил эту проблему, это мое решение.

 static List<Snackbar> snackBarList = new ArrayList<>(); public static void mySnackBar(CoordinatorLayout coordinatorLayout, String s,boolean queued) { Snackbar snackbar = Snackbar.make(coordinatorLayout, s, Snackbar.LENGTH_SHORT); if (queued) { //if true set onDismiss CallBack snackbar.setCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar currentSnackbar, int event) { super.onDismissed(currentSnackbar, event); //first remove current snackBar in List, then if List not empty show the first one snackBarList.remove(currentSnackbar); if (snackBarList.size() > 0) snackBarList.get(0).show(); } }); //add (set callback) snackBar to List snackBarList.add(snackbar); //the beginning if (snackBarList.size() == 1) snackBarList.get(0).show(); } else snackbar.show(); } 

Я написал библиотеку, которая делает именно это. Он также включает progressBar. Попробуйте https://github.com/tingyik90/snackprogressbar

Я также реализовал свои собственные, возможно, не самые slickest, но подходит для моих потребностей. Его в C # для Xamarin .

 public class SnackbarManager : Snackbar.Callback { List<Snackbar> snackbarsWaiting; List<Snackbar> snackbarsHolding; public SnackbarManager() { snackbarsWaiting = new List<Snackbar>(); snackbarsHolding = new List<Snackbar>(); } public void AddToQueue(Snackbar snackbar) { if (snackbar.Duration == Snackbar.LengthIndefinite) snackbar.SetDuration(Snackbar.LengthLong); snackbar.SetCallback(this); if (snackbarsWaiting.Count > 0 && snackbarsWaiting[0].IsShown) snackbarsHolding.Add(snackbar); else snackbarsWaiting.Add(snackbar); } public void Show() { if (snackbarsWaiting.Count > 0 && !snackbarsWaiting[0].IsShown) snackbarsWaiting[0].Show(); } public override void OnDismissed(Snackbar snackbar, int evt) { base.OnDismissed(snackbar, evt); snackbarsWaiting.Remove(snackbar); if (snackbarsHolding.Count > 0) { snackbarsWaiting.AddRange(snackbarsHolding); snackbarsHolding.Clear(); } if (snackbarsWaiting.Count > 0) snackbarsWaiting[0].Show(); } }