我看到 Snackbar 在确定其在屏幕上显示的长度时只会占用 LENGTH_LONG 或 LENGTH_SHORT。
我想让它显示出来,直到有人将它从屏幕上滑下来。这适用于您遇到持续错误的某些情况,例如当您没有互联网并且您希望在选择 LENGTH_LONG 时通知用户而不会在 2750 毫秒后从屏幕上消失。
当然,我可以使用 setDuration 来设置一个非常长的毫秒值,但是有没有办法只设置它以使其在用户关闭它之前不会消失?
最新版本的 Android 支持库 ( 22.2.1 ),现在包括LENGTH_INDEFINITE
.
以下将显示 Snackbar,直到它被关闭或显示另一个 Snackbar。
Snackbar.make(view, "Your Snackbar", Snackbar.LENGTH_INDEFINITE)
.setAction("Your Action", null).show();
更新:如前所述,随着 Android 支持库 22.2.1 的发布,现在可以使用 LENGTH_INDEFINITE 标志
使用 Android 设计支持库中的官方实现时,无法设置 Snackbar 的无限显示。
虽然这样做可能会违反 Snackbar 的 Material Design 理念,但有 3rd 方 Snackbar 实现确实允许这样做。这是一个例子:
https://github.com/nispok/snackbar
该项目允许显示持续时间的以下值:
LENGTH_SHORT: 2s
LENGTH_LONG: 3.5s (default)
LENGTH_INDEFINTE: Indefinite; ideal for persistent errors
请注意,由于官方 Snackbar 实施的发布,该项目不再被开发。
我正在使用com.android.support:appcompat-v7:26.1.0并且Snackbar.LENGTH_INDEFINITE
可以正常工作。示例可能如下所示:
private HashMap<Long, Snackbar> mTokenSnackbarMap = new LinkedHashMap<>();
private void dropPoint(@NonNull Location location) {
final Long token = SystemClock.elapsedRealtime();
// <submitPoint> is the callback to be executed
// at a time in the future, if the "cancel" button
// of the Snackbar isn't clicked until that time.
Runnable submitPoint = () -> {
Snackbar bar = mTokenSnackbarMap.get(token);
if (bar != null) {
// "cancel" button of the Snackbar wasn't clicked,
// but our time is up. Dismiss the Snackbar.
bar.dismiss();
mTokenSnackbarMap.remove(token);
Log.i(TAG, "dropPoint: dismiss snackbar");
}
mDatabase.add(Point.Factory.create(uid, location));
Log.i(TAG, "dropPoint: addPoint");
};
// The indefinite Snackbar allowing arbitrary cancellation.
Snackbar snackbar = Snackbar.make(mMainView, R.string.point_pending, Snackbar.LENGTH_INDEFINITE)
.setAction(R.string.cancel, (v) -> {
mTokenSnackbarMap.remove(token);
mUiHandler.removeCallbacks(submitPoint, token);
Log.i(TAG, "dropPoint: cancel snackbar");
});
mTokenSnackbarMap.put(token, snackbar);
mUiHandler.postAtTime(submitPoint, token,
SystemClock.uptimeMillis() + Constants.POINT_DELAY_MILLIS);
Log.i(TAG, "dropPoint: postAtTime");
snackbar.show();
}
根据文档,您可以LENGTH_INDEFINITE
在设置持续时间时使用标志:
Snackbar.make(view, "my snackbar", Snackbar.LENGTH_INDEFINITE).show();
Snackbars 会自动从屏幕超时。它们不应该是持久的或堆叠的,因为它们在屏幕上的其他元素之上。
因此,Snackbars 似乎不适合通知用户的用例,直到用户采取措施将其关闭。
相反,您应该考虑使用 Dialog
对话框始终保持焦点,直到被关闭或采取了所需的操作
欲了解更多信息,请参阅: