itgoyo / AndroidSummary

12 stars 4 forks source link

结合Dialog的onClick()事件理解Android中的回调函数 #95

Open itgoyo opened 5 years ago

itgoyo commented 5 years ago

最近在自定义Dialog时遇到问题,由于Dialog绘图代码可能慢于逻辑代码,所以使用自定义Dialog时,new之后直接外部获取自定义Dialog中的控件设置监听事件就会无响应。解决办法可以使用 sendEmptyMessageDelayed(),但更好的就是将Dialog中的控件监听事件都封装在Dialog内部,即利用回调机制。

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;
    }

到此整个函数回调的定义都已经完成了,那么怎么使用呢?

四、使用

  1. new 一个 BaseDialog:
BaseDialog baseDialog = new BaseDialog(activity,"退出登录","确认退出登录吗?","确认");
  1. 调用该Dialog对外提供的设置事件回调接口的方法:
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();它会去回调真正的实现方法。