2015-10-21 7 views
17

私がsnackbarを複数回呼び出すと、最後のsnackbar項目だけが表示されます。Snackbar isQueued()はいつ使用されますか? (snackbarをキューに入れる方法)

以下のコードでは、項目3のみが表示されます。項目1のために(?とゼロに設定)Snackbar.LENGTH_LONGは無視されているようですし、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 documentsに、私はメッセージをキューすることが可能であることがわかります。

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; 
      } 
     } 
+0

このメソッドは、最新のサポートライブラリ(23.1.0)http://developer.android.com/sdk/support_api_diff/23.1.0/changes/android.supportに追加されました。 design.widget.Snackbar.html –

+3

誰かが 'isShownOrQueued()'の使用方法を知りましたか? –

答えて

6

は、あなたの問題を解決し、部分的抜粋です。そこで私は自分でそれを実装することに決めました。あなたはそれを試すことができますhttps://github.com/AntonyGolovin/FluentSnackbar

Builderでimportant()とコールすると、キューに追加されます。

4

私もスナックバーのキューを実装するために必要ななく、準備ができて解決策を見つけられませんでした:それは が物事について移動する正しい方法ではないかもしれませんが、ここで

+0

ニース。これは最初からどのように機能していたのでしょうか。 – ObjectType

1

私は自分自身も実装していますが、おそらく最もスリックではありませんが、私のニーズに合っています。その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(); 
    } 

} 
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(); 
} 
関連する問題