Button之setOnClickListener

一个简单的自定义控件设置Button的点击事件,我的写法如下,发现当点击Button时并不能响应点击事件,如initData当中的写法,第一种不响应,第二种响应,很是费解,查看源码

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

自定义控件初始化时是讲cancelClick指向的对象地址赋值给setOnClickListener的形参,再赋值给getListenerInfo()的mOnClickListener,当点击时通过该变量调用我们传入的对象的onClick方法,当我们在代码中通过setCancelClickListener设置cancelClick时,cancelClick指向的对象改变,但getListenerInfo()的mOnClickListener指向的对象不变,所以无法响应代码中设置的click事件,而第二种写法mOnClickListener会调用continueClick的onClick方法,此时continueClick指向的对象已经变为代码中设置的click事件,所以能够响应,但这种写法显然很烂,所以我们改为

public void setCancelClickListener(OnClickListener cancelClick) {
    btn_cancel.setOnClickListener(cancelClick);
}
这其实是形参和实参的区别,以下为错误代码:

public class CCButtonView extends LinearLayout {

    private View root;
    private Button btn_cancel;
    private Button btn_continue;
    private OnClickListener cancelClick;
    private OnClickListener continueClick;

    public CCButtonView(Context context) {
        super(context);
        init();
    }

    public CCButtonView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CCButtonView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        root = View.inflate(getContext(), R.layout.view_ccbutton, this);
        initView();
        initData();
    }

    private void initData() {
       btn_cancel.setOnClickListener(cancelClick);
        btn_continue.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                continueClick.onClick(v);
            }
        });
    }

    public void setCancelClickListener(OnClickListener cancelClick) {
      //  btn_cancel.setOnClickListener(cancelClick);
        this.cancelClick=cancelClick;
    }

    public void setContinueClickListener(OnClickListener continueClick) {
        this.continueClick = continueClick;
    }

    private void initView() {
        btn_cancel = (Button) root.findViewById(R.id.btn_cancel);
        btn_continue = (Button) root.findViewById(R.id.btn_continue);
    }


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值