一个简单的自定义控件设置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); }