安卓弹窗中断设计
原文链接:https://blog.youkuaiyun.com/qq_26723241/article/details/79015919
写的不错,抄一份答案。
public class Dialog implements DialogInterface{
private Message mDismissMessage;//窗口消失时候的Message实例
private static final int DISMISS = 0x43;//咱们只看dissmiss这个状态,cancel和show是同理
private final Handler mListenersHandler;//一个Handler实例
Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
mListenersHandler = new ListenersHandler(this);//ListenersHandler内部类,继承了Handler
}
private void sendDismissMessage() {
if (mDismissMessage != null) {
Message.obtain(mDismissMessage).sendToTarget();//Message.obtain(message)想当于copy一个新的message, 每一个Message中有一个Handler索引,sendToTarget方法内部调用Handler.sendMessage(this)发送信息。
}
}
public void setOnDismissListener(@Nullable DialogInterface.OnDismissListener listener) {
if (listener != null) {
mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener);//handler的obtainMessage(what,Object)方法返回一个what等于DISMISS,Object等于listenter,Target等于handler的Message
} else {
mDismissMessage = null;
}
}
private static final class ListenersHandler extends Handler {
private final WeakReference<DialogInterface> mDialog;
public ListenersHandler(Dialog dialog) {
mDialog = new WeakReference<DialogInterface>(dialog);//弱引用
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {//联系上了,msg.what肯定是DISMISS
case DISMISS:
((DialogInterface.OnDismissListener) msg.obj).onDismiss(mDialog.get());//msg的obj就是Listener呗,调用其中的onDismiss方法。
break;
}
}
}
}
这篇博客详细介绍了Android中Dialog的中断设计,包括如何在窗口关闭时触发监听器。作者通过创建一个ListenersHandler内部类,利用Handler的Message机制,在Dialog关闭时调用OnDismissListener的onDismiss方法,实现对话框消失时的回调功能。文中还展示了关键代码实现,展示了如何设置和处理窗口关闭事件。
2873

被折叠的 条评论
为什么被折叠?



