昨天听了一节在线视频课程,发现这个接口回调确实在开发中特别有用而且载android开发中也经常见到,接口回调就是当发生每件事的时候,调用相应的方法,比如我们的Button,当被点击的时候,就会调用onClick,前提是你已经给Button加上监听器了,Button是继承自TextView,而TextView则是继承自View,View是根类,所以就查看了View的源代码,我摘了能说明问题的一段代码,如下:
public class View implements Drawable.Callback, KeyEvent.Callback,
AccessibilityEventSource {
/**
* Listener used to dispatch click events. This field should be made
* private, so it is hidden from the SDK. {@hide}
*/
public OnClickListener mOnClickListener;
/**
* Register a callback to be invoked when this view is clicked. If this view
* is not clickable, it becomes clickable.
*
* @param l
* The callback that will run
*
* @see #setClickable(boolean)
*/
public void setOnClickListener(OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
/**
* Called when a view has been clicked.
*
* @param v
* The view that was clicked.
*/
void onClick(View v);
}
}
上面代码中OnClickListener就是一个接口
再来看看我们使用Button的常用回调方法onClick:
public class Temple extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Button button = (Button) findViewById(R.id.item3_dlbtn);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
...
}
});
}
}
参考上面View的源代码,我们知道, 当我们调用 button.setOnClickListener(listener)时,其实就是将new好的listener这个对象赋值给View类中的mOnClickListener,而要new出一个listener接口对象(OnClickListener接口对象),你就要实现接口中未实现的方法onClick()方法,所以最终赋值给mOnClickListener的listener已经是一个实现了onCLick方法的接口对象,当你点击按钮的这个动作被系统感知后,View就会通过mOnClickListener对象调用onClick方法
我当时理解这种机制费了很大的劲,现在搞明白也算是学习了
后期补充:
接口就像一个桥梁,将MainActivity.class与自定义View:MyView联系起来,为了解释清楚,下面给出伪代码:
public interface onMyViewClickListener{
void onViewClick(...);
}
public class MyView{
private onMyViewClickListener mListener;
系统中监听屏幕被点击的某个方法{
mListener.onViewClick(...);
}
public void setOnViewClickListener(onMyViewClickListener listener){
mListener = listener;
}
}
MainActivity implements onMyViewClickListener{
myView.setOnViewClickListener(this);
//重写接口中的方法
public void onViewClick(...){
// 当MyView被点击是的响应
}
}
由于MainActivity实现了onMyViewClickListener接口,所以就可以把他当作接口对象来用
当myView.setOnViewClickListener(this);时,MainActivity这个接口对象就被传入给了myView对象中的mListener,所以在
系统中监听屏幕被点击的某个方法{
mListener.onViewClick(...);
}
中的mListener对象实质上就是MainActivity这个接口对象,所以mListener.onViewClick(...);这句调用的就是MainActivity这个接口对象中实现的onViewClick(...)方法。