Android View的点击事件与回调函数

回调函数

最简单的回调函数场景:有A类和B类,A类的C方法,B类的D方法
A需要调用B类的D方法,而B类的D方法又需要调用A类的C方法,也就是相互调用。
简单的回调函数使用可以参考如下代码

/**
* 回调函数
*/
public interface Callback {
    void meet(ScheduleTable schedule);
}


/**
Boss类 实现CallBack接口
**/
public class Boss implements CallBack{
    private Secretary mSecretary;

    public Boss(Secretary secretary) {
        this.mSecretary = secretary;
    }

    /**
    * 从秘书这拿到时间表后,boss开始干活
    */
    public void meet(ScheduleTable schedule) {
        // 出去跑业务
    }

    /**
    * 吩咐秘书做一个时间表
    */
    public assignTask() {
        mSceretary.makeScheduleTable(this);
    }

}

/**
秘书类
**/
public class Secretary {

    /**
    * 创建时间表
    */
    public void makeScheduleTable(CallBack callback) {
        ScheduleTable schedule = new ScheduleTable();
        callback.meet(schedule);
    }

}

Android中View的点击事件

在学习最简单的Button使用的时候,都会写这么一个函数setOnClickListener(),然后要么写一个匿名OnClickListener传进去作为参数,要么Activity/Fragment实现OnClickListener的接口
那么看下View的源码里setOnClickListener是怎么实现的

public void setOnClickListener(@Nullable OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    getListenerInfo().mOnClickListener = l;
}

其中

static class ListenerInfo {
    protected OnFocusChangeListener mOnFocusChangedListener;
    protected OnClickListener mOnClickListener;
    // ...
    //拥有相关的各种回调函数
}

也就是说,让View里的static类ListenerInfo持有了我们定义的CallBack,那么这个CallBack什么时候生效呢,源码中有一个performClick()函数

public boolean performClick() {
    final boolean result;
    final ListenerInfo li = mListenerInfo;
    // 判断listenerInfo是否存在 并且是否有callback
    if (li != null && li.mOnClickListener != null) {
        playSoundEffect(SoundEffectConstants.CLICK);
        li.mOnClickListener.onClick(this); // 执行callback中相应的函数,这里是onClick(View)
        result = true;
    } else {
        result = false;
    }

    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

    notifyEnterOrExitForAutoFillIfNeeded(true);

    // 返回值为true时表示调用的是传入的callback,否则为false
    return result;
    }

这是一个很典型的回调函数的例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值