Android按钮内部onClick操作
我正在制作一个自定义按钮,用于在内部处理onClick事件。以下是我的实现的简化版本:Android按钮内部onClick操作,android,Android,我正在制作一个自定义按钮,用于在内部处理onClick事件。以下是我的实现的简化版本: public class CustomButton extends Button implements View.OnClickListener { public CustomButton(Context context) { super(context); setOnClickListener(this); } @Override publi
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。但这与按钮的代码无关,而是选择器。如果你还没有。