Android支持库Snackbar,长度不确定

时间:2015-06-27 16:10:05

标签: android snackbar

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

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

当然我可以将setDuration用于一个可笑的长毫秒值,但是没有办法只是设置它以便它不会消失直到用户解除它?

5 个答案:

答案 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

  

对话框始终保持关注,直到被解雇或已采取必要的行动

有关详细信息,请参阅:

Material Design Guidelines - Snackbars

Material Design Guidelines - Dialogs