一、首先定义监听函数
public interface OnKeyValueListener { void getKeyValueClick(String value); }
二、在需要传递内容的 A类 中传入该监听对象
2.1 获取监听
public class MyButton {
public MyButton(Context context) {
}
private OnKeyValueListener mOnkeyValueListener; //定义监听接口,接受Main类传过来的监听对象
//模拟用户触摸屏幕时系统底层进行的操作
public void doClick() {
mOnkeyValueListener.getKeyValueClick("点击了A"); //该方法可以在A类跟Main类中调用,都会将内容传给Main类。这句话就实现了监听的效果
}
public OnKeyValueListener getmOnkeyValueListener() {
return mOnkeyValueListener;
}
public void setmOnkeyValueListener(OnKeyValueListener mOnkeyValueListener) {
this.mOnkeyValueListener = mOnkeyValueListener; //Main类中调用该方法,传入监听对象
}
}
2.2 传递内容
在该类中需要调用的地方实现监听函数方法
mOnkeyValueListener.getKeyValueClick("点击了A"); //该方法可以在A类跟Main类中调用,都会将内容传给Main类。这句话就实现了监听的效果
三、传入监听函数,并实现方法
public class MainActivity extends Activity implements OnKeyValueListener{
MyButton myButton ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = new MyButton(MainActivity.this);
myButton.setmOnkeyValueListener(this); //传递监听对象到A类
myButton.doClick(); //这里是调用A类中的方法,接受到A类传入的内容
}
@Override
public void getKeyValueClick(String value) {
Log.d("panzq","######## value = "+value); //打印获取到的内容
}
}
结果
2019-04-17 12:55:38.285 3660-3660/com.panzq.callbacklistener D/panzq: ######## value = 点击了A
1.为按钮setmOnkeyValueListener注册监听,将括号里面的this作为参数传给MyButton,this继承了 OnKeyValueListener
2.由于MyButton中有一个setmOnkeyValueListener方法,通过this.mOnkeyValueListener = mOnkeyValueListener;;可以将第一步传进来的OnKeyValueListener对象赋给其成员变量
3.用户点击屏幕,触发系统底层的doClick函数
4.在doClick函数中mOnkeyValueListener.getKeyValueClick("点击了A")中,由第二步我们已知listener已被赋予成用户传进来的具体实现,所以此时的 mOnkeyValueListener.getKeyValueClick("点击了A");所调用的方法就是用户传进来的listener中重写的getKeyValueClick方法,到这里也就是相当于反过来调用回用户所重写的getKeyValueClick(),这里的getKeyValueClick也就是我们常说的回调方法。