使用 SnackBar 实例反复显示
Use SnackBar instance to show again & again
步数
我可以这样保存 SnackBar 实例:
mSnackBar = Snackbar.make(view, R.string.snack_text, Snackbar.LENGTH_INDEFINITE);
而对于第 1st 次,使用以下代码很容易显示:mSnackBar.show();
问题
但是在我清除这个零食之后使用这个:mSnackBar.dismiss()
它不再在 LOLLIPOP 设备中显示,
它在 JELLYBEAN 中再次显示(需要时使用 show()
) 模拟器,这是 预期的 行为。
问题
请帮我找出 LOLLIPOP 设备在这个过程中有什么问题或缺失?
查看源代码,我可以看到 "dismissal of the snackbar" 会使 currentSnackBar 无效。
Source Code - 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();
}
}
}
如果它为 null,则不会显示小吃店。
Solution
您不应在 SnackBar 上调用 dismiss,它会在持续时间到期或单击操作按钮时自动隐藏。只需再次调用 show 方法而不首先调用 dismiss 即可再次显示 SnackBar。
步数
我可以这样保存 SnackBar 实例:
mSnackBar = Snackbar.make(view, R.string.snack_text, Snackbar.LENGTH_INDEFINITE);
而对于第 1st 次,使用以下代码很容易显示:mSnackBar.show();
问题
但是在我清除这个零食之后使用这个:mSnackBar.dismiss()
它不再在 LOLLIPOP 设备中显示,
它在 JELLYBEAN 中再次显示(需要时使用 show()
) 模拟器,这是 预期的 行为。
问题
请帮我找出 LOLLIPOP 设备在这个过程中有什么问题或缺失?
查看源代码,我可以看到 "dismissal of the snackbar" 会使 currentSnackBar 无效。
Source Code - 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();
}
}
}
如果它为 null,则不会显示小吃店。
Solution
您不应在 SnackBar 上调用 dismiss,它会在持续时间到期或单击操作按钮时自动隐藏。只需再次调用 show 方法而不首先调用 dismiss 即可再次显示 SnackBar。