2015-10-21 13 views
17

Nếu tôi gọi thanh snack nhiều lần liên tiếp, chỉ mục đồ ăn nhanh cuối cùng mới được hiển thị.khi nào Snackbar làQueued() được sử dụng? (Làm thế nào để xếp hàng snackbar)

ví dụ: với các mã bên dưới, chỉ mục 3 mới được hiển thị. có vẻ như Snackbar.LENGTH_LONG bị bỏ qua (và thiết lập để không?) cho mục 1 và 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(); 

được nêu ra trong các google documents, tôi thấy rằng nó có thể xếp hàng các thông điệp.

public boolean isShownOrQueued() 

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

nên làm thế nào để chúng tôi thực sự xếp hàng các snackbar?

+0

Chỉ cần lưu ý, phương pháp này đã được thêm vào Thư viện hỗ trợ mới nhất (23.1.0) http://developer.android.com/sdk/support_api_diff/23.1.0/changes/android.support. design.widget.Snackbar.html –

+3

Có ai biết cách 'isShownOrQueued()' có thể được sử dụng không? –

Trả lời

6

Dưới đây là một đoạn trích một phần có thể giải quyết vấn đề của bạn, mặc dù nó có thể không là cách chính xác để đi về điều:

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

Tôi cũng cần thiết để thực hiện một danh sách các tiệm nhưng không tìm thấy giải pháp sẵn sàng . Vì vậy, tôi quyết định tự mình thực hiện nó. Bạn có thể thử nó https://github.com/AntonyGolovin/FluentSnackbar.

Chỉ cần gọi important() trên Trình tạo và nó sẽ được thêm vào hàng đợi.

+0

Rất đẹp. Đây là cách nó nên đã làm việc ngay từ đầu. – ObjectType

1

Tôi cũng thực hiện của riêng mình, có lẽ không phải là slickest nhưng phù hợp với nhu cầu của tôi. Mặc dù vậy, trong C# của nó là 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

Tôi cũng gặp vấn đề này, đây là giải pháp của tôi.

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(); 
} 
Các vấn đề liên quan