接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。
看到这句话的时候我已经晕了,于是我总结了android中通俗易懂的例子来总结什么是接口回调:
假设某个MainActivity中有一个自定义view对象myView,现在想在myView每次被点击的时候,Mainactivity中就添加一个TextView,怎么做?
做法1:使用View自带的接口回调方法,即setOnClickListener();
<1.布局中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.vpad_meta.v2.myblog_1.MainActivity">
<com.vpad_meta.v2.myblog_1.MyView
android:id="@+id/mv"
android:layout_width="100dp"
android:layout_height="40dp"
android:background="#339999" />
</LinearLayout>
<2.什么都没有的自定义View
public class MyView extends View {
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
}
<3.MainActivity中的代码
public class MainActivity extends AppCompatActivity { private LinearLayout linearLayout; private MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myView = (MyView) findViewById(R.id.mv); linearLayout = (LinearLayout) findViewById(R.id.content); myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView tv = new TextView(MainActivity.this); tv.setText("我是新的TextView"); tv.setTextSize(20); linearLayout.addView(tv); } }); } }
其中,myView.setOnClickListener(new View.OnClickListener( )){ ...onClick( )}就是接口回调的应用
1 根据这个例子,我们先来分析接口回调是用来干嘛的:
activity想实现某些功能,但是它不想立即实现,而是在另一个类的对象触发某一事件的时候再实现,于是就用到了接口回调;
例子中,MainActivity想添加TextView,但是它不想固定添加的个数,而是想动态的添加,这时候就需要另一个组件即MyView的点击事件来动态的添加,这里MyView就是另一个类的对象,通过触碰这个对象,来实现MainActivity中其它组件的变动.
2.我们来看一下android中接口回调的模式:
3.结合例子:这就是以上接口回调的实现方式
最后我们主要分析一下MyView中继承了View些什么:
1.OnClickListener它是接口对象,是protected
2.setOnClickListener它是接口对象的实例化方法 , 是public
3.onClick它是接口对象内部的抽象方法
下面我们来使用自己的接口来实现接口回调:
做法2:使用自己的接口来实现回调方法
<1.Interface:
public interface AddViewlistener {
void addView();
}
<2.MyView
public class MyView extends View {
private Paint mPaint;
private int flag;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(2);
mPaint.setColor(Color.parseColor("#ffffff"));
mPaint.setTextAlign(Paint.Align.CENTER);
mPaint.setTextSize(40);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawText("添加了" + flag + "个tv", getMeasuredWidth() / 2, getMeasuredHeight() / 2, mPaint);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (addViewlistener != null) {
//3当触摸事件发生时,如果此接口对象不为空,就调用此接口对象的方法
//注意,这是事件的触发点,而此时具体的方法体是什么,还要靠MainActivity中的MyView具体对象来实现
addViewlistener.addView();
flag++;
invalidate();
}
break;
}
return super.onTouchEvent(event);
}
//1创建接口对象
private AddViewlistener addViewlistener = null;
//2创建实现接口对象的方法
public void setAddViewlistener(AddViewlistener addViewlistener) {
this.addViewlistener = addViewlistener;
}
}
<3.MainActivity
public class MainActivity extends AppCompatActivity {
private LinearLayout linearLayout;
private MyView myView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myView = (MyView) findViewById(R.id.mv);
linearLayout = (LinearLayout) findViewById(R.id.content);
//MyView具体对象实现接口对象的方法,注意此时只是实现方法,尚未触发.
myView.setAddViewlistener(new AddViewlistener() {
@Override
public void addView() {
TextView tv = new TextView(MainActivity.this);
tv.setTextSize(20);
tv.setText("我是新的tv");
linearLayout.addView(tv);
}
});
}
}
最后注意:触发事件一定来自于某个方法的执行,所以真正触发事件的是调用了addViewListener.addView( )方法的方法!,也就是onTouchEvent();
这里要说一下onTouchEvent()和onTouchListener的区别:
onTouchEvent是view内部的方法,一般用于通过touch事件改变view内部布局或调整view本身,包括坐标等
onTouchListener则和onClickListener一样是一个监听器接口,view只是继承或使用了该接口的对象 ,作为监听器,一般用于通过触碰view本身来改变外部的数据或布局.
本人只是菜鸟,有问题请大神多多指正~