2015-06-09 16 views
53

Android thư viện hỗ trợ thiết kế hiện nay bao gồm hỗ trợ cho Snackbar.Làm thế nào để loại bỏ một Snackbar bằng cách sử dụng nút Hành động của riêng nó?

Tôi đã sử dụng đoạn mã sau để tạo ra một:

Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG) 
     .setAction("Dismiss", new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

      } 
     }).show(); 

Các snackbar có thể bị miễn nhiệm bởi một swipe. Tuy nhiên, tôi cũng muốn loại bỏ nó bằng cách sử dụng Nút Hành động của chính nó (được tạo bằng cách sử dụng hàm setAction).

Tuy nhiên, dường như không có bất kỳ chức năng nào có thể thực hiện điều đó.

+4

là một lưu ý cho người dân đến đây , thực hiện hành động "Loại bỏ" trên Thanh thức ăn nhẹ "chống lại [Nguyên tắc thiết kế Material Design của Google] (https://material.google.com/components/snackbars-toasts.html#snackbars-toasts-usage). – Loyalar

Trả lời

86

Phương thức .make trả về đối tượng Snackbar. Lưu một thể hiện của đối tượng đó bằng cách làm cho nó final. Sau đó, trong onClick(), gọi .dismiss:

final Snackbar snackBar = Snackbar.make(findViewById(R.id.root_layout), result, Snackbar.LENGTH_LONG); 

snackBar.setAction("Dismiss", new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     snackBar.dismiss(); 
    } 
}); 
snackBar.show(); 
+2

nếu tôi thực hiện điều này trong bố cục điều phối với FloatingActionButton, thì FloatingActionButton không bị hỏng. –

+32

Một thanh snack được loại bỏ theo mặc định khi nhấp vào hành động. Rõ ràng gọi phương thức bỏ qua là không cần thiết. –

+8

@MarkBuikema tính năng này đã được thêm vào sau này. Vào thời điểm câu hỏi không phải là hành vi điếc tai của quán ăn vặt. – EE66

36

Thực hiện một hành động nhấp chuột và để cho nó trống rỗng. Nhấp vào hành động nhấp chuột trống sẽ loại bỏ snackbar.

Snackbar.make(coordinatorLayoutView, "Service Enabled", Snackbar.LENGTH_LONG) 
         .setAction("DISMISS", new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
          } 
         }) 
         .show(); 
2

tôi đã cùng một vấn đề. Khi tôi sử dụng .dismiss() các hình ảnh động nhìn khác nhau và có hai vấn đề:

  1. FAB không đi xuống một lần nữa
  2. các SnackBar tự nó không trượt xuống như nó sẽ vào Click một

Nhìn vào Bộ luật Android Nguồn gốc cho Snackbar tôi tìm thấy giải pháp sau đây:

View snackbarView = snackbar.getView(); 
Button snackbarActionButton = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action); 
//snackbarActionButton.setSoundEffectsEnabled(false); // might be considered in order not to have a confusing sound because nothing was clicked by the user 

sau đó, tôi sẽ gọi .performClick trên snackBarActionButton

snackBarActionButton.performClick(); 

Link to the Source Code Android cho Snackbar: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java

+0

Không có ý nghĩa gì đối với tôi. Tại sao bạn nên gọi performClick() nếu bạn thực sự nhấp vào một nút? Điều đó dường như vô nghĩa. –

1

Snackbar (từ 'com.android.support:design:23.2.1') hỗ trợ nhiều loại bỏ hành động. Bạn có thể tạo một bộ lọc đơn giản bằng cách sử dụng kiện, chẳng hạn như trong ví dụ này:

Snackbar.make(view, wornMessage, Snackbar.LENGTH_LONG).setActionTextColor(context.getResources().getColor(R.color.primary)) 
    .setCallback(new Snackbar.Callback() { 
     @Override 
     public void onShown(Snackbar snackbar) { 
      super.onShown(snackbar); 
     // when snackbar is showing 
     } 

     @Override 
     public void onDismissed(Snackbar snackbar, int event) { 
      super.onDismissed(snackbar, event); 
      if (event != DISMISS_EVENT_ACTION) { 
       //will be true if user not click on Action button (for example: manual dismiss, dismiss by swipe 
      } 
     } 
    }) 
    .setAction("Undo, view1 -> { 
     // if user click on Action button 
}).show(); 

Snackbar của loại bỏ:

/** Indicates that the Snackbar was dismissed via a swipe.*/ 
public static final int DISMISS_EVENT_SWIPE = 0; 
/** Indicates that the Snackbar was dismissed via an action click.*/ 
public static final int DISMISS_EVENT_ACTION = 1; 
/** Indicates that the Snackbar was dismissed via a timeout.*/ 
public static final int DISMISS_EVENT_TIMEOUT = 2; 
/** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/ 
public static final int DISMISS_EVENT_MANUAL = 3; 
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/ 
public static final int DISMISS_EVENT_CONSECUTIVE = 4; 

T.B. Trong mã mẫu sử dụng biểu thức lambda (bởi RetroLambda)

+0

Câu hỏi không phải là về trình xử lý loại bỏ. Câu hỏi đặt ra là cách loại bỏ khi nhấp vào nút. –

5

Khi bạn sử dụng Snackbar.LENGTH_LONG bạn không cần nút tác vụ để loại bỏ, sau khi tự động loại bỏ thứ hai. Bạn nên sử dụng mã này:

Snackbar snackbar = Snackbar.make(relativeLayout, "Your Message", Snackbar.LENGTH_INDEFINITE); 
      snackbar.setAction("dismiss", new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        snackbar.dismiss(); 
       } 
      }); 

      snackbar.show(); 

Hãy cẩn thận dòng này:

Snackbar.LENGTH_INDEFINITE 
3

Đây là một câu hỏi cũ, nhưng tôi chỉ muốn chia sẻ kinh nghiệm của riêng tôi xung quanh tính năng tương tự trên Snackbar.Vì vậy, chúng tôi có một thiết kế cho ứng dụng của chúng tôi, quán bar đó sẽ được hiển thị vô thời hạn và người dùng có thể loại bỏ nó .. nhưng không nên có nút DISMISS bên trong nó (Google không khuyến nghị Bỏ qua hoặc Hủy hành động trong snackbars). Snackbar của chúng tôi đã bị sa thải chỉ bằng cách khai thác trên đó.

Giải pháp duy nhất, làm việc cho chúng ta, là vào cuối (Tôi đang sử dụng retrolambda ở đây, nhưng tiêu chuẩn View.OnClickListener có thể được sử dụng như là tốt):

final Snackbar snack = ... /* create proper snackbar as alway */ 
snack.getView().setOnClickListener(v -> snack.dismiss()); 

Note getView() cuộc gọi trong giữa;) Hy vọng nó có thể giúp ai đó, một ngày nào đó :)

Best Regards,

Darek

+0

Bạn đọc ở đâu "Google không đề xuất Loại bỏ hoặc Hủy các hành động trong Snackbars"? Tôi muốn đọc lý do .... – JoseF

+0

@ JoseF Vui lòng kiểm tra bình luận đầu tiên dưới chính câu hỏi đó;) Đó là trong hướng dẫn Material Design: https://material.io/guidelines/components/snackbars-toasts.html#snackbars -quyền sử dụng ("0-1 hành động, không loại bỏ hoặc hủy") –

Các vấn đề liên quan