2015-06-09 25 views
53

Android設計支持庫現在包含對Snackbar的支持。如何使用自己的操作按鈕來關閉小吃店?

我用下面的代碼來創建一個:

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

      } 
     }).show(); 

的小吃吧可以用刷卡被解僱。不過,我也想用它自己的Action Button(使用setAction函數創建)解除它。

但是,似乎沒有任何可以做到的功能。

+4

作爲一個說明人們來這裏,對「Snackbar」進行「解僱」操作違反了[Google資料設計指南](https://material.google.com/components/snackbars-toasts.html#snackbars-toasts-usage)。 – Loyalar

回答

86

.make方法返回Snackbar對象。通過使該對象的實例保存爲final。然後,在onClick(),叫.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

如果我在帶有FloatingActionButton的協調器佈局中執行此操作,則FloatingActionButton不會落下。 –

+32

單擊該操作時,快餐欄會被默認解散。顯式調用dismiss方法是不必要的。 –

+8

@MarkBuikema此功能稍後添加。當時的問題不是小吃店的失控行爲。 – EE66

36

實現點擊動作,讓它空。點擊空白點擊動作將關閉快餐欄。

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

我有同樣的問題。當我用.dismiss()的動畫看起來不同,有兩個問題:

  1. FAB不下去再次
  2. 的小吃吧本身像它會在點擊不滑下

展望原生Android源代碼小吃吧,我發現了以下解決方案:

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 

然後,我會打電話的.performClick上snackBarActionButton

snackBarActionButton.performClick(); 

鏈接到Android源代碼的小吃吧: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java

+0

對我沒有任何意義。如果你實際點擊一個按鈕,爲什麼還要調用performClick()?這似乎是無稽之談。 –

1

小吃吧(從'com.android.support:design:23.2.1')支持多種類型的解僱行動。

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

小吃吧的解僱類型:

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

附註:您可以通過使用事件,比如在這個例子中創建一個簡單的過濾器在示例代碼中使用lambda表達式(由RetroLambda)

+0

這個問題不是關於解僱處理程序。問題是如何解除按鈕點擊。 –

5

當您使用Snackbar.LENGTH_LONG你不需要操作鍵解僱,之後第二自動解散。 您應使用此代碼:

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

小心此行

Snackbar.LENGTH_INDEFINITE 
3

這是一個老問題,但我只是想分享周圍小吃吧類似的功能我自己的經驗。所以我們爲我們的應用程序設計了一個應用程序,小吃棒應該無限期地顯示,用戶應該可以解除它。但是它裏面不應該有DISMISS按鈕(谷歌不建議在快餐店內部放棄或取消操作)。我們的小吃店只是通過點擊它而被解僱。

唯一的解決方案,爲我們的工作,是在最後(我在這裏使用retrolambda,但標準View.OnClickListener可以作爲很好):

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

getView()呼叫中間;)希望它可以幫助別人,總有一天:)

最好的問候,

Darek

+0

您在哪裏閱讀「Google不推薦在Snackbar中放棄或取消操作」?我想閱讀原因.... – JoseF

+0

@JoseF請檢查問題本身的第一條評論;)它是在材料設計指南:https://material.io/guidelines/components/snackbars-toasts.html#snackbars -toasts-usage(「0-1行動,不解僱或取消」) –

相關問題