回调分为几部分:接口interface、回调类class、实现类class。
一、写一个接口OnMyBtClick:
package com.example.mydemo;
public interface OnMyBtClick {
void onClick();
}
上为一个最简单的接口,接口里面只有一个方法。
二、写一个回调类MyButton:
package com.example.mydemo;
public class MyButton {
OnMyBtClick listener;
/**
* 关键就在于参数是个接口
* */
public void setOnClickListener(OnMyBtClick listener) {
this.listener = listener;
}
}
回调类中触发事件被我简化了。仅仅为了更简洁的看出这个回调。
简单讲两句我的理解:
一、类MyButton.class是一个非常普通的类,但是,当实例化类MyButton的时候,调用自身方法setOnClickListener(OnMyBtClick listener)时会发现,参数不是一个普通的类,
而是一个接口类OnMyBtClick,所以当需要listener时,必然涉及到实现OnMyBtClick接口new一个新的类或者匿名类。实现接口内onClick()方法。
二、实现了 这个方法后发现好像实现了这个MyButton没什么用,是不是?因为我简化了这个MyButton类。正常代码如下:
package com.example.mydemo;
public class MyButton {
OnMyBtClick listener;
/**
* 触发事件
* 当点击的时候,listener存在,onClick方法也已经被实现了
* */
public void click() {
listener.onClick();
}
/**
* 关键就在于参数是个接口
* */
public void setOnClickListener(OnMyBtClick listener) {
this.listener = listener;
}
}
如上,这样子就有触发事件了。click()方法。
再简单讲两句我的理解:
从这就能看出实现接口的意义:把onClick()方法的具体内容交给用这个类的人去自己实现。加大灵活性。
如果OnMyBtClick是个普通类,那么我就固定了只能在我的onClick()方法写死,灵活性及复用性上差不少。(又比如我的网络链接请求,每次成功后,我都必须有个处理,总不能每次都做一样的事情,这儿就可以类推)
三、写个主方法:调用看看效果。
package com.example.mydemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
MyButton myButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
myButton = new MyButton();
myButton.setOnClickListener(new OnMyBtClick() {
@Override
public void onClick() {
Toast.makeText(getApplicationContext(), "myBt被点击了",
Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
/**
* 触发事件
* */
myButton.click();
break;
default:
break;
}
return true;
}
}
是不是看着很熟悉,这段代码:(是不是和监听事件很像?对,就是这个效果),相信你已经理解了回调。
myButton = new MyButton();
myButton.setOnClickListener(new OnMyBtClick() {
@Override
public void onClick() {
Toast.makeText(getApplicationContext(), "myBt被点击了",
Toast.LENGTH_SHORT).show();
}
});