我看到Snackbar在确定屏幕显示的长度时只会采用LENGTH_LONG或LENGTH_SHORT。
我想让它显示,直到有人将其从屏幕上滑下来。这种情况适用于某些情况,当您遇到持续性错误时,例如当您没有互联网时,您希望在选择LENGTH_LONG后2750ms之后通知用户而不会使其从屏幕上消失。
当然我可以将setDuration用于一个可笑的长毫秒值,但是没有办法只是设置它以便它不会消失直到用户解除它?
答案 0 :(得分:50)
最新版Android支持库(22.2.1)现已包含LENGTH_INDEFINITE
。
以下内容将显示Snackbar,直至它被解除或显示另一个Snackbar。
Snackbar.make(view, "Your Snackbar", Snackbar.LENGTH_INDEFINITE)
.setAction("Your Action", null).show();
答案 1 :(得分:10)
更新:如前所述,现在可以发布Android支持库22.2.1,使用LENGTH_INDEFINITE标志
使用Android设计支持库中的官方实现时,无法设置Snackbar的无限期显示。
虽然这样做可能违反了Snackbar的Material Design理念,但是第三方Snackbar实现确实允许这样做。这是一个例子:
https://github.com/nispok/snackbar
此项目允许显示持续时间的以下值:
LENGTH_SHORT: 2s
LENGTH_LONG: 3.5s (default)
LENGTH_INDEFINTE: Indefinite; ideal for persistent errors
请注意,由于官方Snackbar实施的发布,该项目已不再开发。
答案 2 :(得分:2)
我正在使用 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();
}
答案 3 :(得分:0)
根据文档,您可以在设置持续时间时使用LENGTH_INDEFINITE标志:
Snackbar.make(view, "my snackbar", Snackbar.LENGTH_INDEFINITE).show();
答案 4 :(得分:-1)
Snackbars会自动从屏幕上超时。它们不应该持久或堆叠,因为它们高于屏幕上的其他元素。
因此,Snackbars似乎不适合用户通知用户,直到用户做某事来解雇它。
相反,您应该考虑使用Dialog
对话框始终保持关注,直到被解雇或已采取必要的行动
有关详细信息,请参阅: