Open itgoyo opened 5 years ago
最近在自定义Dialog时遇到问题,由于Dialog绘图代码可能慢于逻辑代码,所以使用自定义Dialog时,new之后直接外部获取自定义Dialog中的控件设置监听事件就会无响应。解决办法可以使用 sendEmptyMessageDelayed(),但更好的就是将Dialog中的控件监听事件都封装在Dialog内部,即利用回调机制。
sendEmptyMessageDelayed()
Dialog监听事件回调的实现:
假设我们新建了一个继承自Dialog的类,命名为BaseDialog,接口回调定义在该类中!
首先我们定义回调事件接口:
public interface OnDialogClickListener{ void onSureClickListener(); //当点击了确认按钮之后执行 void onCancelClickListener(); //当点击了取消按钮之后执行 }
接口定义好了,我们很明显能看到里面两个函数的意思,那就是当点击了确认按钮后执行的操作和点击了取消按钮后执行的操作,哪里调用呢?当然是点击了相应按钮的时候了!但是我们还没有实例来调用,所以我们执行步骤2先声明一个。
private OnDialogClickListener onDialogClickListener;
先不管初始化问题,反正我们是要调用的,所以就先调用,当然调用之前最好先判空一下,防止你一直都忘记初始化:
btnSure.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onDialogClickListener != null) { onDialogClickListener.onSureClickListener(); } } }); btnCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (onDialogClickListener != null) { onDialogClickListener.onCancelClickListener(); } } });
我们调用了这两个方法,由于是接口,方法没有实例化,先不管,继续按照步骤3,对外提供设置事件回调的接口,这一步也就是提供onDialogClickListener的初始化操作,执行完这一步,onDialogClickListener就不会为空了。
public void setOnDialogClickListener(OnDialogClickListener onDialogClickListener){ this.onDialogClickListener = onDialogClickListener; }
到此整个函数回调的定义都已经完成了,那么怎么使用呢?
BaseDialog baseDialog = new BaseDialog(activity,"退出登录","确认退出登录吗?","确认");
baseDialog.setOnDialogClickListener(new BaseDialog.OnDialogClickListener() { @Override public void onSureClickListener() { //执行对应操作,如退出登录,升级,下载等 loginout(); baseDialog.dismiss(); } @Override public void onCancelClickListener() { baseDialog.dismiss(); } });
setOnDialogClickListener(OnBaseDialogClickListener onBaseDialogClickListener)方法需要接收一个OnBaseDialogClickListener 作为参数,我们new一个之后就需要重写该接口的两个未实例化的方法,所以当执行了onClick()之后调用onDialogClickListener.onSureClickListener();它会去回调真正的实现方法。
最近在自定义Dialog时遇到问题,由于Dialog绘图代码可能慢于逻辑代码,所以使用自定义Dialog时,new之后直接外部获取自定义Dialog中的控件设置监听事件就会无响应。解决办法可以使用
sendEmptyMessageDelayed()
,但更好的就是将Dialog中的控件监听事件都封装在Dialog内部,即利用回调机制。Dialog监听事件回调的实现:
一、定义回调事件的接口
假设我们新建了一个继承自Dialog的类,命名为BaseDialog,接口回调定义在该类中!
首先我们定义回调事件接口:
接口定义好了,我们很明显能看到里面两个函数的意思,那就是当点击了确认按钮后执行的操作和点击了取消按钮后执行的操作,哪里调用呢?当然是点击了相应按钮的时候了!但是我们还没有实例来调用,所以我们执行步骤2先声明一个。
二、声明回调事件
先不管初始化问题,反正我们是要调用的,所以就先调用,当然调用之前最好先判空一下,防止你一直都忘记初始化:
我们调用了这两个方法,由于是接口,方法没有实例化,先不管,继续按照步骤3,对外提供设置事件回调的接口,这一步也就是提供onDialogClickListener的初始化操作,执行完这一步,onDialogClickListener就不会为空了。
三、对外提供设置事件回调的接口
到此整个函数回调的定义都已经完成了,那么怎么使用呢?
四、使用
setOnDialogClickListener(OnBaseDialogClickListener onBaseDialogClickListener)方法需要接收一个OnBaseDialogClickListener 作为参数,我们new一个之后就需要重写该接口的两个未实例化的方法,所以当执行了onClick()之后调用onDialogClickListener.onSureClickListener();它会去回调真正的实现方法。