2015-10-21 3 views
17

Wenn ich die Snackbar mehrmals hintereinander anrufe, wird nur die letzte Snackbar angezeigt.Wann wird Snackbar isQueued() verwendet? (Wie schiebe ich die Snackbar an)

z.B. Mit den untenstehenden Codes würde nur Punkt 3 angezeigt. es scheint, dass Snackbar.LENGTH_LONG ignoriert (und auf Null?) für Punkt 1 und 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(); 

noch in den google documents, sehe ich, dass es möglich ist, die Nachrichten in der Warteschlange.

public boolean isShownOrQueued() 

Returns whether this Snackbar is currently being shown, 
or is queued to be shown next. 

so wie eigentlich wir die snackbar Warteschlange?

+0

Nur eine Anmerkung, diese Methode wurde der neuesten Support-Bibliothek (23.1.0) http://developer.android.com/sdk/support_api_diff/23.1.0/changes/android.support hinzugefügt. design.widget.Snackbar.html –

+3

Hat jemand herausgefunden, wie 'isShownOrQueued()' verwendet werden kann? –

Antwort

6

Hier ist ein Teilausschnitt, Ihr Problem löst, obwohl es nicht der richtige Weg sein könnte, über Dinge zu gehen:

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

ich auch eine Warteschlange von Snack-Bars zu implementieren benötigt, aber nicht bereit Lösung gefunden habe . Also habe ich beschlossen, es alleine zu implementieren. Sie können es versuchen https://github.com/AntonyGolovin/FluentSnackbar.

Rufen Sie einfach important() auf Builder und es wird in die Warteschlange hinzugefügt.

+0

Schön. So hätte es von Anfang an funktionieren sollen. – ObjectType

1

Ich implementierte auch meine eigenen, wahrscheinlich nicht die glattesten aber geeignet meine Bedürfnisse. Es ist in C# für Xamarin obwohl.

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

Ich habe dieses Problem auch, das ist meine Lösung.

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