2014-02-17 57 views
0

通過Android View代碼(特別是RadioButton和RadioGroup),我發現兩個類一次只允許一個Listener(外部提供 - 它們也有自己的內部監聽器)。設置第二監聽器只覆蓋:Android視圖一次只允許一個Listener?

例如,在RadioGroup中:

public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { 
    mOnCheckedChangeListener = listener; 
} 

我會假設一組監聽器將保持(或鏈接),並通過迭代上的賽事轉播。相反,無論哪個聽衆是最後一次設置「勝利」。這似乎很脆弱。

這是什麼原理?

+0

如果您想保留默認偵聽器,則可以始終擴展OnCheckedChangeListener,如MyOnCheckedChangeListener並從子類中調用super。 –

+0

NAA,但我不認爲這是脆弱的。當你設置一個監聽器時,你應該完全知道*從那一點開始將調用什麼方法。你不應該擔心之前的聽衆是什麼。如果你需要更多的東西,你可以擴展/改變它以用於特定用途,但我不認爲它應該是默認的。 – Geobits

回答

1

這主要是爲了處理像UI分層的事情。例如,您可能有背景,其上有View A,可處理點擊 - 但您在用戶單擊按鈕時顯示View B以上A。現在,如果您點擊B,您不希望A作出迴應。它的意思是簡化。

如評論中所述,例如,在處理點擊之後,某些事件可以返回false,以便下一層可以處理該事件。

如果確實創建了對所有等待從單擊事件中聽到的對象的引用,則可以使用有序數據結構(例如ArrayList)來確保事件的處理順序不是隨機的。

例如,從接口開始,該接口的方法返回truefalseOnCheckedChange不這樣做(移動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; 
     } 
    } 
}); 

現在所有的聽衆都有機會做出迴應,但訂單將被處理,如onClickonTouch。你也可以不致電break,只讓所有的聽衆被調用(按順序)。