我正在制作一个自定义按钮,用于在内部处理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
事件中的哪种方法?
答案 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()
,以便它只将传递的侦听器存储为实例变量。在构造时,按钮将自己设置为自己的点击侦听器,以便它可以接收点击事件,执行某些操作,然后将事件传递给存储的侦听器。