Android自学 – 回调函数
自定义界面时使用到了回调函数实现类似Android的点击事件的函数,即使用时只要实现onClick方法就行了。
https://blog.csdn.net/wojiaotianyong/article/details/70948632
(回调函数就是在一个不确定实现的方法METHOD中用interface或者它的抽象方法留个口子,留给具体调用者(调用前边那个不确定的方法METHOD)在调用时提供具体实现来补上那个口子。从而达到更灵活地编码的目的,也大大减少了子类的使用)
1.声明一个方法接口
public interface OnSatelliteMenuItemClickListener
{
void onClick(View view, int pos); // 这个是最终在调用类里实现的调用的
}
2.声明注册方法(接受自定义组件调用者传过来的回调方法的)
在回调的内部注册
public OnSatelliteMenuItemClickListener mMenuItemClickListener;
public void setOnSatelliteMenuItemClickListener(OnSatelliteMenuItemClickListener l){
mMenuItemClickListener = l;
}
这里注册方法名叫setOnSatelliteMenuItemClickListener,类似使用Android点击事件是需要先注册监听器setOnClickListener,这里也是一样,使用时需要先注册,后面会讲到
3.在内部调用回调
你需要在哪里使用到这个回调。
就比如说,在我的例子中,当按钮被点击时,会调用我定义的接口方法onClick(View view, int pos);但是这个onClick方法到底里面是怎么写的我还不知道,我只需要在我自定义的界面中调用就好了,具体调用了之后要干什么,需要你自己去定义,就像android的按钮点击一样,具体的实现要在onClick(View view)中自己写。
childView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mMenuItemClickListener != null)
mMenuItemClickListener.onClick(childView, pos);
4.具体接口函数的实现
在最终需要使用的时候,实现一下,参考android的点击事件
SatelliteMenu s = findViewById(R.id.satelliteMenu); //我自定义的控件
// 注册回调,将具体的实现函数传到自定义控件那里,让他知道我调用onClick时,具体需要做什么
s.setOnSatelliteMenuItemClickListener(new SatelliteMenu.OnSatelliteMenuItemClickListener() {
@Override
public void onClick(View view, int pos) {
// 具体实现
Toast.makeText(MainActivity.this,pos+""+view.getTag(),Toast.LENGTH_SHORT).show();
}
});
硬要理解的话,
- 我对朋友讲,这个月我有一个计划,这个计划我还没确定是什么,但是名字想好了,叫sb计划。
- 我决定,这个计划具体做什么有你来定,你想好了可以通过电话,把这个sb计划内容告诉我。
- 这个sb计划具体定在这个月15号执行(触发事件,方法在哪使用)。
- 朋友想好了,把sb计划通过电话告诉我。这样当我15号执行sb计划时,就知道要干什么了。