主要我之前用的时候不知道dismiss和cancel有啥区别。。。然后今天想起来了就去查了一下,顺便记下来备忘。
dismiss:大概就是删除视图,调用Onstop回调,并把mShowing置为false。
void dismissDialog() {
if (mDecor == null || !mShowing) {
return;
}
if (mWindow.isDestroyed()) {
Log.e(TAG, "Tried to dismissDialog() but the Dialog's window was already destroyed!");
return;
}
try {
mWindowManager.removeViewImmediate(mDecor);
} finally {
if (mActionMode != null) {
mActionMode.finish();
}
mDecor = null;
mWindow.closeAllPanels();
onStop();
mShowing = false;
sendDismissMessage();
}
}
cancel:也调用了dismiss,只不过先判断了mCancelMessage是否为空
@Override
public void cancel() {
if (!mCanceled && mCancelMessage != null) {
mCanceled = true;
Message.obtain(mCancelMessage).sendToTarget();
}
dismiss();
}
mCancelMessage实际上是把listener封装成obj的Message
public void setOnCancelListener(@Nullable OnCancelListener listener) {
if (mCancelAndDismissTaken != null) {
throw new IllegalStateException(
"OnCancelListener is already taken by "
+ mCancelAndDismissTaken + " and can not be replaced.");
}
if (listener != null) {
mCancelMessage = mListenersHandler.obtainMessage(CANCEL, listener);
} else {
mCancelMessage = null;
}
}
hide:这是干嘛的。。。隐藏起来又不销毁,有啥用?万一后面忘了呢,销毁Activity的时候就会报错:android.view.WindowLeaked: Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorViewthat was originally added here,所以建议不用。
public void hide() {
if (mDecor != null) {
mDecor.setVisibility(View.GONE);
}
}
总结:
建议用dismiss,这个比cancel少一个判断,一般来说是够用了,当然如果你有CancelListener的话就用cancel。。。