Snackbar有时在替换另一个时不显示

时间:2017-04-28 12:48:40

标签: android android-snackbar

我遇到了一个关于android的Snackbars的奇怪问题。我通过Snackbar + Retry-Action显示错误消息。当'重试'单击,错误仍然在这里(例如没有互联网)我再次显示错误。 单击Snackbar中的操作会自动关闭当前显示的一个,并显示一个新的Snackbar,而旧的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 - 不再调用回调。

为什么会这样?我应该报告这个问题吗?任何已知的解决方法?

2 个答案:

答案 0 :(得分:4)

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

private Snackbar currentlyShownSnackbar;    

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

只需保留对当前显示的Snackbar的引用,就不会再出现此问题。我不知道为什么,也许它与过早的垃圾收集有关。

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

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

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

答案 1 :(得分:0)

很明显,如果您关闭当前的SnackBar并稍等一下再显示,则它可以工作。我正在使用Kotlin Extension Function使其更易于使用:

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

所以我这样称呼它:

mySnackBar.dismissAndShow()