【问题标题】:Snackbar sometimes doesn't show up when it replaces another oneSnackbar 有时在替换另一个时不显示
【发布时间】:2017-09-26 14:22:28
【问题描述】:

我在 Android 上遇到了 Snackbars 的一个奇怪问题。我通过 Snackbar + Retry-Action 显示错误消息。当单击“重试”并且错误仍然存​​在时(例如,没有互联网)我再次显示错误。 单击 Snackbar 中的操作会自动关闭当前显示的 Snackbar,并显示一个新的 Snackbar,而旧的 Snackbar 仍然“淡出”按预期工作。

但有时(当我单击“重试”约 30 次时)在我多次按下按钮后,Snackbar 根本不会出现。

我可以用这个简单的代码重现它:

final View.OnClickListener retryListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        showSnackbar();
    }
};

private void showSnackbar() {
    Snackbar snackbar = Snackbar.make(root, "Error", BaseTransientBottomBar.LENGTH_INDEFINITE)
            .setAction("Retry", retryListener)
            //Callback only for debugging-purposes
            .addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() {
                @Override
                public void onShown(Snackbar transientBottomBar) {
                    super.onShown(transientBottomBar);
                    Log.d(TAG, "onShown called");
                }
            });
    snackbar.show();
    Log.d(TAG, "show called");
}

当我在这段代码出现问题后查看 logcat 时,最后一行是 show called 并且不再调用 onShown-callback。

为什么会发生这种情况?我应该将此作为问题报告吗?任何已知的解决方法?

【问题讨论】:

  • 你找到解决这个问题了吗?
  • @Taranmeet 我找到了解决方法,请参阅我的答案

标签: android android-snackbar


【解决方案1】:

我还没有找到它发生的真正原因,也没有找到问题的真正解决方案,但我找到了一个适合我的解决方法:

private Snackbar currentlyShownSnackbar;    

private void showSnackbar() {
    Snackbar snackbar = Snackbar.make(...);
    snackbar.show();
    currentlyShownSnackbar = snackbar;
}

只需保留对当前显示的 Snackbar 的引用,这个问题就不会再发生了。不知道为什么,可能跟垃圾回收太早有关。

代码检查会说此变量已分配但从未使用过 - 可以忽略此警告。

我还在我的 Activity 中添加了这个以防止任何可能的内存泄漏:

public void onPause() {
    super.onPause();
    this.currentlyShownSnackbar = null;
}

【讨论】:

  • 谢谢,我遇到了同样的问题,我已经用你的解决方案解决了这个问题。
【解决方案2】:

显然,如果您关闭当前的SnackBar 并稍等片刻再次显示它,它就会起作用。我使用Kotlin Extension Function 使其更易于使用:

fun Snackbar.dismissAndShow() {
    if (isShownOrQueued) {
        dismiss()
        view.postDelayed(1000L) { show() }
    } else {
        show()
    }
}

所以我这样称呼它:

mySnackBar.dismissAndShow()

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 2019-03-24
    • 2017-05-25
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多