這主要是爲了處理像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