如何使用它自己的操作button来closures小吃店?

Androiddevise支持库现在包含对Snackbar的支持。

我用下面的代码来创build一个:

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函数创build)来解除它。

但是,似乎没有任何可以做到的function。

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

实施一个点击动作,并让其为空。 点击空白点击动作将closures快餐栏。

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

当你使用Snackbar.LENGTH_LONG你不需要操作button来解雇,第二次自动解雇后。 你应该使用这个代码:

  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 

这是一个古老的问题,但我只想分享我自己的经验,在小吃店的类似function。 因此,我们为我们的应用程序devise了一个小吃棒应该无限期地显示,用户应该能够解雇它。但是里面不应该有DISMISSbutton(Google不build议在小吃店里面放弃或取消操作)。 我们的小吃店只能通过点击而被解雇。

唯一的解决scheme,为我们工作,最后(我在这里使用retrolambda,但也可以使用标准的View.OnClickListener):

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

注意getView()调用中间;)希望它可以帮助别人,有一天:)

最好的祝福,

Darek

我有同样的问题。 当我使用.dismiss()的animation看起来不同,有两个问题:

  1. FAB不会再次下降
  2. SnackBar本身不会像点击一样滑落

查看最初的Android Snipbar源代码我find了以下解决scheme:

 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 

然后,我会调用snackBarActionButton上的.performClick

 snackBarActionButton.performClick(); 

链接到Snackbar的Android源代码: https ://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/design/src/android/support/design/widget/Snackbar.java

零食(来自'com.android.support:design:23.2.1' )支持许多types的解雇行动。 您可以使用事件来创build一个简单的filter,例如:

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

小吃店的解雇types:

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

PS在示例代码中使用lambdaexpression式(由RetroLambda)