30

我看到 Snackbar 在确定其在屏幕上显示的长度时只会占用 LENGTH_LONG 或 LENGTH_SHORT。

我想让它显示出来,直到有人将它从屏幕上滑下来。这适用于您遇到持续错误的某些情况,例如当您没有互联网并且您希望在选择 LENGTH_LONG 时通知用户而不会在 2750 毫秒后从屏幕上消失。

当然,我可以使用 setDuration 来设置一个非常长的毫秒值,但是有没有办法只设置它以使其在用户关闭它之前不会消失?

4

5 回答 5

61

最新版本的 Android 支持库 ( 22.2.1 ),现在包括LENGTH_INDEFINITE.

以下将显示 Snackbar,直到它被关闭或显示另一个 Snackbar。

Snackbar.make(view, "Your Snackbar", Snackbar.LENGTH_INDEFINITE)
        .setAction("Your Action", null).show();
于 2015-07-18T14:17:17.250 回答
12

更新:如前所述,随着 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 实施的发布,该项目不再被开发。

于 2015-06-27T22:33:39.787 回答
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();
}
于 2018-01-10T10:54:28.983 回答
1

根据文档,您可以LENGTH_INDEFINITE在设置持续时间时使用标志:

Snackbar.make(view, "my snackbar", Snackbar.LENGTH_INDEFINITE).show();
于 2020-12-07T07:03:47.887 回答
-1

Snackbars 会自动从屏幕超时。它们不应该是持久的或堆叠的,因为它们在屏幕上的其他元素之上。

因此,Snackbars 似乎不适合通知用户的用例,直到用户采取措施将其关闭。

相反,您应该考虑使用 Dialog

对话框始终保持焦点,直到被关闭或采取了所需的操作

欲了解更多信息,请参阅:

材料设计指南 - 小吃店

材料设计指南 - 对话框

于 2017-11-01T00:56:45.713 回答