Android支持库Snackbar,长度不定

Android支持库Snackbar,长度不定,android,snackbar,Android,Snackbar,我看到,当确定屏幕上显示的长度时,Snackbar只会选择LENGTH_LONG或LENGTH_SHORT 我想让它显示,直到有人把它从屏幕上刷下来。在某些情况下,当您出现持续错误时,例如您没有互联网,并且在选择“长度”时,您希望在2750毫秒后通知用户,而不会让其从屏幕上消失 当然,我可以将setDuration设置为一个长得离谱的毫秒值,但是没有办法只设置它,这样它就不会消失,直到用户将其删除吗?更新:如前所述,随着Android支持库22.2.1的发布,现在可以使用长度不定标志了 在使用A

我看到,当确定屏幕上显示的长度时,Snackbar只会选择LENGTH_LONG或LENGTH_SHORT

我想让它显示,直到有人把它从屏幕上刷下来。在某些情况下,当您出现持续错误时,例如您没有互联网,并且在选择“长度”时,您希望在2750毫秒后通知用户,而不会让其从屏幕上消失


当然,我可以将setDuration设置为一个长得离谱的毫秒值,但是没有办法只设置它,这样它就不会消失,直到用户将其删除吗?

更新:如前所述,随着Android支持库22.2.1的发布,现在可以使用长度不定标志了

在使用Android设计支持库的官方实现时,不可能设置Snackbar的无限显示

虽然这样做可能会违反Snackbar的材料设计理念,但也有第三方Snackbar实现允许这样做。以下是一个例子:

此项目允许在显示期间使用以下值:

LENGTH_SHORT: 2s
LENGTH_LONG: 3.5s (default)
LENGTH_INDEFINTE: Indefinite; ideal for persistent errors

请注意,由于官方Snackbar实现的发布,该项目不再开发。

最新版本的Android支持库()现在包括

以下内容将显示Snackbar,直到它被解除或显示另一个Snackbar

Snackbar.make(view, "Your Snackbar", Snackbar.LENGTH_INDEFINITE)
        .setAction("Your Action", null).show();
Snackbar会自动从屏幕超时。它们不应该是持久的或堆叠的,因为它们在屏幕上的其他元素之上

因此,snackbar似乎不适合您的用例,即通知用户直到用户做了一些事情来消除它

相反,您应该考虑使用对话框

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

有关更多信息,请参阅:


我使用的是com.android。支持:appcompat-v7:26.1.0
Snackbar。长度不定
工作正常。示例可以如下所示:

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();
}
private HashMap mTokenSnackbarMap=new LinkedHashMap();
私有void dropPoint(@NonNull位置){
最终长令牌=SystemClock.elapsedRealtime();
//是否要执行回调
//在将来的某个时间,如果“取消”按钮
//直到那时,Snackbar的图标才被点击。
可运行提交点=()->{
Snackbar bar=mTokenSnackbarMap.get(令牌);
如果(bar!=null){
//没有单击Snackbar的“取消”按钮,
//但我们的时间到了,把蛇条扔了吧。
bar.dispose();
mTokenSnackbarMap.remove(令牌);
Log.i(标记“dropPoint:discouse snackbar”);
}
添加(Point.Factory.create(uid,location));
Log.i(标记“dropPoint:addPoint”);
};
//允许任意取消的不确定的Snackbar。
Snackbar Snackbar=Snackbar.make(mMainView,R.string.point\u挂起,Snackbar.LENGTH\u不确定)
.setAction(R.string.cancel,(v)->{
mTokenSnackbarMap.remove(令牌);
移除回调(submitPoint,token);
Log.i(标记“dropPoint:cancelsnackbar”);
});
mTokenSnackbarMap.put(令牌、snackbar);
邮递时间(提交点、代币、,
SystemClock.uptimeMillis()+常量.POINT_DELAY_MILLIS);
Log.i(标记“dropPoint:postAtTime”);
snackbar.show();
}

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

Snackbar.make(view, "my snackbar", Snackbar.LENGTH_INDEFINITE).show();

值得注意的是,《材质设计指南》明确指出,蛇形条是瞬态视图元素。这意味着它们在任何情况下都不应该被卡在屏幕上,因为它们阻挡了屏幕上的其他元素。同意,观点正确。你认为“禁止上网”消息必须构建在我的UI视图中吗?如果snackbar不是正确的工具,如何通知用户“没有互联网”?如果活动/永久连接非常重要,我有时会将工具栏更改为另一种颜色,更改图标或显示通知。如果它只是一个加载数据的回收器/列表视图,您应该在那里显示消息(带有刷新按钮),直到它被另一个片段替换。在用户输入中使用snackbar现在可以使用最近发布的support design 22.2.1。在emulator中工作正常。。。但至少在我的设备上(装有安卓7.0的Moto G4 Plus)没有显示snackbar。所以归根结底是@Edward对问题本身的评论:不想要这个,你打算怎么驳回它?你不能。当然,你需要一个对snackbar的引用,以后才能将其删除。但你可以用最简单的方法来做。