什么时候用Snackbar isQueued()? (如何排列快餐栏)

如果我连续多次拨打快餐栏,则只显示最后一个快餐栏项目。

例如下面的代码,只会显示第3项。 对于项目1和2,Snackbar.LENGTH_LONG似乎被忽略(并设置为零?)。

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(); 

但在谷歌文件 ,我看到有可能排队消息。

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

那么我们该如何排队呢?

Solutions Collecting From Web of "什么时候用Snackbar isQueued()? (如何排列快餐栏)"

这是一个解决你的问题的部分片段,虽然它可能不是正确的方法去做的事情:

 //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; } } 

我还需要实现一个小吃店排队,但没有find现成的解决scheme。 所以我决定自行实施。 你可以试试https://github.com/AntonyGolovin/FluentSnackbar

只需在Builder上调用important() ,它就会被添加到队列中。

我也遇到这个问题,这是我的解决scheme。

 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

我也执行了我自己的,可能不是最光滑的,但适合我的需要。 它在Xamarin的 C#中。

 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(); } }