这主要是为了处理像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
,只让所有的听众被调用(按顺序)。
如果您想保留默认侦听器,则可以始终扩展OnCheckedChangeListener,如MyOnCheckedChangeListener并从子类中调用super。 –
NAA,但我不认为这是脆弱的。当你设置一个监听器时,你应该完全知道*从那一点开始将调用什么方法。你不应该担心之前的听众是什么。如果你需要更多的东西,你可以扩展/改变它以用于特定用途,但我不认为它应该是默认的。 – Geobits