通过Android视图代码(特别是在RadioButton和RadioGroup),我看到两个类一次只允许一个侦听器(外部提供 - 它们也有自己的内部侦听器)。设置第二个Listener只会覆盖:
例如,在RadioGroup:
public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
mOnCheckedChangeListener = listener;
}
我假设一组监听器将被保留(或链接),并在事件广播中迭代。相反,最后设置的听众“获胜”。这似乎很脆弱。
这是什么原因?
答案 0 :(得分:1)
这主要用于处理UI分层等事情。例如,您可能有背景,其上方有View A
来处理点击次数 - 但是当用户点击按钮时,您会在View B
上方显示A
。现在,如果您点击B
,则不希望A
回复。这意味着简化。
如评论中所述,某些事件可以在处理点击后返回false
,例如,以便下一层可以处理该事件。
如果您确实创建了对等待点击事件的所有对象的引用,则可以使用有序数据结构(例如ArrayList
)来确保处理事件的顺序不是随机。
例如,从接口开始,该接口具有返回true
或false
的方法。 OnCheckedChange
不会这样做(移动了d
:
public interface OnCheckChangedListener {
public boolean onCheckChanged(CompoundButton buttonView, boolean isChecked)
}
现在使用以下全局变量创建RadioGroup
的子类:
private List<OnCheckChangedListener> listeners = new ArrayList<OnCheckChangedListener>();
然后有方法:
public void addOnCheckChangedListener(OnCheckChangedListener listener) {
this.listeners.add(listener);
}
public void removeOnCheckChangedListener(OnCheckChangedListener listener) {
this.listeners.remove(listener);
}
然后在你的构造函数中,添加:
this.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChange(CompoundButton buttonView, boolean isChecked) {
for (int i = 0; i < listeners.size(); i++) {
if (listeners.get(i).onCheckChanged(buttonView, isChecked))
break;
}
}
});
现在所有听众都有机会回复,但订单将会像onClick
或onTouch
一样处理。你也不能调用break
,只是让所有的听众都被调用(按顺序)。