Android学习路之Android中的接口回调(一)

接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。

看到这句话的时候我已经晕了,于是我总结了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本身来改变外部的数据或布局.

以上就是对于android中接口回调的初步讲解,一个interface,view,activity之间的故事。

本人只是菜鸟,有问题请大神多多指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值