21

如果我连续多次调用小吃店,则只显示最后一个小吃店项目。

例如,使用下面的代码,只会显示第 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.

那么我们如何在小吃店排队呢?

4

5 回答 5

8

这是解决您问题的部分片段,尽管它可能不是正确的处理方式:

//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;
            }
        }
于 2015-11-12T22:23:55.203 回答
5

我还需要实现一个小吃店队列,但没有找到现成的解决方案。所以我决定自己实现它。你可以试试https://github.com/AntonyGolovin/FluentSnackbar

只需调用important()Builder,它将被添加到队列中。

于 2016-04-04T17:32:19.467 回答
4

我也实现了自己的,可能不是最巧妙的,但适合我的需要。虽然它在 C# for 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();
    }

}
于 2016-04-08T12:11:38.717 回答
2

我已经写了一个库来做到这一点。它还包括进度条。试试看https://github.com/tingyik90/snackprogressbar

于 2017-06-01T11:33:10.957 回答
2

我也遇到了这个问题,这是我的解决方案。

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();
}
于 2016-08-26T05:20:40.643 回答