我创建了实现侦听器接口的自定义按钮类:
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.BlinkButton中的onClick方法应该在用户单击BlinkButton时隐式调用,但事实并非如此。
我必须明确地写出来:
android:onClick="fireEvent"
和
public void fireEvent(View view) {
fireEventButton.onClick(view);
}
为什么选择BlinkButton.onClick();用户点击按钮后不会自动触发?
答案 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)
BlinkButton类只实现了监听器。如果您了解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);
}
}