Android按钮内部onClick操作

时间:2016-03-09 08:39:01

标签: android

我正在制作一个自定义按钮,用于在内部处理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来抛出异常,但是我不想阻止按钮拥有外部监听器,我只想添加一个内部功能。

如果有Button的哪种方法可以覆盖,在单击按钮时执行额外的操作而不会消除其他类监听onClick事件的能力?基本上,Button调度OnClick事件中的哪种方法?

1 个答案:

答案 0 :(得分:0)

我想到了一个解决方案。我按如下方式制作了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(),以便它只将传递的侦听器存储为实例变量。在构造时,按钮将自己设置为自己的点击侦听器,以便它可以接收点击事件,执行某些操作,然后将事件传递给存储的侦听器。