OnClickListener无法隐式工作。为什么?

时间:2015-07-14 15:32:12

标签: java android onclicklistener

我创建了实现侦听器接口的自定义按钮类:

public class BlinkButton  extends Button implements View.OnClickListener {

List<OnClickListener> onClickListenerList = new ArrayList<OnClickListener>();

public BlinkButton(Context context) {
    super(context);
    this.setListener(new HighLightButtonListener());
}

//other constructors here 

public void setListener(OnClickListener listener){
    onClickListenerList.add(listener);
}

@Override
public void onClick(View v) {
    for(OnClickListener listener : onClickListenerList){
        listener.onClick(this);
    }
}

我有看法:

   <com.example.element.BlinkButton
    .../>

我声称com.example.element.BlinkBut​​ton中的onClick方法应该在用户单击BlinkBut​​ton时隐式调用,但事实并非如此。 我必须明确地写出来: android:onClick="fireEvent"

    public void fireEvent(View view) {
        fireEventButton.onClick(view);
    }  

为什么选择BlinkBut​​ton.onClick();用户点击按钮后不会自动触发?

2 个答案:

答案 0 :(得分:1)

Button(或其超类)本身没有onClick()方法。您实现的那个来自Button类实现的View.OnClickListener接口。

您从未设置过“OnClickListener”课程,而您的代码似乎希望OnClickListener成为该课程本身,因此您的自定义Listeners实际上已被调用。

将此行添加到构造函数中:

setOnClickListener(this);

所以它看起来像这样:

public BlinkButton(Context context) {
    super(context);
    setOnClickListener(this);
    this.setListener(new HighLightButtonListener());
}

您还必须删除onClick xml属性。

答案 1 :(得分:0)

BlinkBut​​ton类只实现了监听器。如果您了解View类如何处理点击,您将找到以下实现:

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

基本上没有办法覆盖方法并获取点击事件。您可以在类中设置一个将在单击时调用的侦听器,这将进一步将事件发送给列表中的所有侦听器。

public class BlinkButton extends Button implements View.OnClickListener {

    List<OnClickListener> onClickListenerList = new ArrayList<OnClickListener>();

    public BlinkButton(Context context) {
        super(context);
        this.setListener(new HighLightButtonListener());
        this.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                for (OnClickListener listener : onClickListenerList) {
                    listener.onClick(this);
                }
            }
        };
    }

    //other constructors here 

    public void setListener(OnClickListener listener) {
        onClickListenerList.add(listener);
    }
}