我们先来说一下Android中最常见的一个接口回调机制:button.setOnClickListener。
先来看看Android中封装好的点击事件OnClikcListener。
来看源代码:
这是View类的setOnClickListener方法:
/**
* 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(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
参数OnClickListener是一个接口,代码如下:
/**
* 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);
}
因为Android中的所有控件几乎都是继承自View的,所以我们经常用得button.setOnClickListener就是调用了这个方法,方法参数是一个OnClickListener接口,而当我们去new OnClickListener这个接口的时候,会实现这个接口中的OnClick方法,而OnClick方法中内置了点击事件的相关处理,所以当我们通过setOnClickListener方法来设置控件的监听事件时,就会调用系统封装好的OnClick方法来实现点击事件的响应,这就是Android中最常见的一个接口回调。
接下来我们仿照Android中的setOnClickListener来写一个小的例子,来模拟一下接口回调机制:
然后我们定义一个功能类,来模仿View类:
public class Work {
//说话接口的变量
private TallListener listener;//通过接口的变量来调用tall方法
public static void setTallListener(TallListener listener) {listener.tall("我说话了");
}
//定义一个说话的内部接口:
public interface TallListener {
void tall(String msg);
}
}
之后我们在Activity中这样调用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//直接调用静态方法,参数可以new一个说话的接口
Work.setTallListener(new Work.TallListener() {
@Override
public void tall(String msg) {
Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
}
});
} }
最后运行项目,弹出一个吐司:我说话了。
其实整个接口回调的机制就是通过一个set方法将接口作为参数传进去,然后接口的变量会调用接口中的方法来实现相应的功能。
如有不对的地方希望大神指出。