代码之家  ›  专栏  ›  技术社区  ›  Ankit Bansal

使用SnackBar实例再次显示

  •  4
  • Ankit Bansal  · 技术社区  · 9 年前

    步骤

    我可以这样保存SnackBar实例:

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

    对于 第一 使用以下方法可以轻松显示: mSnackBar.show();


    问题

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

    在中不再显示 棒棒糖 设备,
    在此处再次显示(需要时使用 show() )在 果冻豆 模拟器 预期 行为


    问题

    请帮助我查找此过程中的错误或缺失 棒棒糖 设备?

    1 回复  |  直到 9 年前
        1
  •  4
  •   cafebabe1991    9 年前

    看到源代码,我可以看到“取消snackbar”将使当前的SnackBars无效。

    源代码-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为空,则不会显示snackbar。

    解决方案

    您不应该在SnackBar上调用discose,当持续时间到期或单击操作按钮时,它会自动隐藏。只需再次调用show方法,而不必首先调用discuss,即可再次显示SnackBar。