2015-10-21 13 views
17

Se chiamo lo snack bar più volte di seguito, viene visualizzata solo l'ultima barra degli snack.quando viene utilizzato Snackbar isQueued()? (Come accodare la barra degli snack)

ad es. con i codici seguenti, verrà mostrato solo l'elemento 3. sembra che Snackbar.LENGTH_LONG viene ignorato (e impostare a zero?) per la voce 1 e 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(); 
ancora

nel google documents, vedo che è possibile fare la coda dei messaggi.

public boolean isShownOrQueued() 

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

così come facciamo in realtà in coda lo snack?

+0

Solo una nota, questo metodo è stato aggiunto alla più recente Support Library (23.1.0) http://developer.android.com/sdk/support_api_diff/23.1.0/changes/android.support. design.widget.Snackbar.html –

+3

Qualcuno ha scoperto come 'isShownOrQueued()' può essere usato? –

risposta

6

Ecco un frammento parziale, che risolve il problema, anche se potrebbe non essere il modo corretto di fare le cose:

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

Ho anche bisogno di implementare una coda di snackbar ma non ha trovato soluzione pronta . Così ho deciso di implementarlo da solo. Puoi provarlo https://github.com/AntonyGolovin/FluentSnackbar.

Basta chiamare important() sul Builder e verrà aggiunto alla coda.

+0

Bello. Questo è come avrebbe dovuto funzionare dall'inizio. – ObjectType

1

Ho implementato anche il mio, probabilmente non il più destro ma adatto alle mie esigenze. È in C# per Xamarin però.

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

Ho incontrato anche questo problema, questa è la mia soluzione.

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