Подтвердить что ты не робот

Когда используется 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.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 5

Я также реализовал свои собственные, возможно, не самые slickest, но подходит для моих потребностей. Его в С# для 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();
    }

}