使用SnackBar实例再次显示&再次

时间:2016-01-01 11:53:40

标签: android android-snackbar snackbar

步骤

我可以像这样保存SnackBar实例:

mSnackBar = Snackbar.make(view, R.string.snack_text, Snackbar.LENGTH_INDEFINITE);

对于第一时间,使用此功能非常容易显示:mSnackBar.show();


问题

但在我清除这个小吃之后:mSnackBar.dismiss()

它未在 LOLLIPOP 设备中再次显示,在 JELLYBEAN 模拟器中再次显示(当需要使用show()时) 预期行为。


问题

请帮助我找到 LOLLIPOP 设备在此过程中出现的问题或缺失?

1 个答案:

答案 0 :(得分:4)

看到源代码,我可以看到"解雇小吃吧"会使currentSnackBar无效。

  

源代码 - SnackBar

public void dismiss(Callback callback, int event) {
    synchronized (mLock) {
        if (isCurrentSnackbarLocked(callback)) {
            cancelSnackbarLocked(mCurrentSnackbar, event);
        } else if (isNextSnackbarLocked(callback)) {
            cancelSnackbarLocked(mNextSnackbar, event);
        }
    }
}

/**
 * Should be called when a Snackbar is no longer displayed. This is after any exit
 * animation has finished.
 */
public void onDismissed(Callback callback) {
    synchronized (mLock) {
        if (isCurrentSnackbarLocked(callback)) {
            // If the callback is from a Snackbar currently show, remove it and show a new one
            mCurrentSnackbar = null;
            if (mNextSnackbar != null) {
                showNextSnackbarLocked();
            }
        }
    }
}

因此,当您在同一个实例上进行演示时,此代码将运行

public void show(int duration, Callback callback) {
    synchronized (mLock) {
        if (isCurrentSnackbarLocked(callback)) {
            // Means that the callback is already in the queue. We'll just update the duration
            mCurrentSnackbar.duration = duration;

            // If this is the Snackbar currently being shown, call re-schedule it's
            // timeout
            mHandler.removeCallbacksAndMessages(mCurrentSnackbar);
            scheduleTimeoutLocked(mCurrentSnackbar);
            return;
        } else if (isNextSnackbarLocked(callback)) {
            // We'll just update the duration
            mNextSnackbar.duration = duration;
        } else {
            // Else, we need to create a new record and queue it
            mNextSnackbar = new SnackbarRecord(duration, callback);
        }

        if (mCurrentSnackbar != null && cancelSnackbarLocked(mCurrentSnackbar,
                Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE)) {
            // If we currently have a Snackbar, try and cancel it and wait in line
            return;
        } else {
            // Clear out the current snackbar
            mCurrentSnackbar = null;
            // Otherwise, just show it now
            showNextSnackbarLocked();
        }
    }
}

如果没有,则不会显示小吃吧。

  

解决方案

你不应该在SnackBar上调用dismiss,它会在持续时间到期或点击一个动作按钮时自动隐藏。只需再次调用show方法而不首先调用dismiss来再次显示SnackBar。