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

それでもGoogleドキュメントでは、メッセージをキューに入れることができることがわかります。

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で試すことができます。

Builder を呼び出すだけimportant()で、キューに追加されます。

于 2016-04-04T17:32:19.467 に答える
4

私はまた、おそらく最も洗練されたものではありませんが、私のニーズに合った独自のものを実装しました。ただし、 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();
    }

}
于 2016-04-08T12:11:38.717 に答える
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 に答える
2

私はまさにそれを行うライブラリを作成しました。また、progressBar も含まれます。試してみてください https://github.com/tingyik90/snackprogressbar

于 2017-06-01T11:33:10.957 に答える