Android按钮内部onClick操作

Android按钮内部onClick操作,android,Android,我正在制作一个自定义按钮,用于在内部处理onClick事件。以下是我的实现的简化版本: public class CustomButton extends Button implements View.OnClickListener { public CustomButton(Context context) { super(context); setOnClickListener(this); } @Override publi

我正在制作一个自定义按钮,用于在内部处理onClick事件。以下是我的实现的简化版本:

public class CustomButton extends Button implements View.OnClickListener {
    public CustomButton(Context context) {
        super(context);
        setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        setText("Clicked!");
    }
}
以上代码中没有意外!问题是,包含按钮的活动/片段/任何内容都可能调用
setOnClickListener(View)
,这将阻止按钮内的
onClick(View)
方法接收onClick事件,从而以不希望的方式更改我的按钮的功能。我想重写
setOnClickListener(View)
以在参数不是
this
时引发异常,但我不想阻止按钮具有外部侦听器,我只想添加一个内部功能


单击按钮时,如果有
按钮的方法,我可以重写哪个方法来执行额外的操作,而不影响其他类侦听onClick事件的能力?基本上,
按钮中的哪个方法调度
OnClick
事件?

我想到了一个解决方案。我制作了如下
CustomButton

public class CustomButton extends Button implements View.OnClickListener {
    private OnClickListener externalOnClickListener;   

    public CustomButton(Context context) {
        super(context);
        super.setOnClickListener(this);
    }


    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        super.setOnClickListener(this);
    }

    public CustomButton(Context context, AttributeSet attrs, int defStyleAttrs) {
        super(context, attrs, defStyleAttrs);
        super.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // Do all of my stuff
        setText("Clicked!");
        setBackground(Color.GREEN);

        // Pass onClick event to external listener
        if (externalOnClickListener != null) {            
            externalOnClickListener.onClick(v);
        }
    }

    @Override
    public void setOnClickListener(OnClickListener l) {
        externalOnClickListener = l;
    }
}

基本上,
setOnClickListener()
被重写,因此它只将传递的侦听器存储为实例变量。在构建时,按钮将自己设置为自己的点击事件监听器,以便它可以接收点击事件,执行某些操作,然后将事件传递给存储的监听器。

按钮
不发送点击事件,系统会发送事件。按钮必须以某种方式接收点击事件,因为它的外观发生了变化。按钮的可视部分接收到一个状态变化,并将自己绘制成
android:state\u pressed
state。但这与
按钮的代码无关,而是选择器。如果你还没有。