2011-05-02 155 views
7

添加監聽器和設置監聽器有什麼區別?添加監聽器和設置監聽器

例如

addTextChangedListener(textWatcher); 
setOnClickListener(clickListener); 

答:

aioobe的回答後,我在我的項目已經測試了這一點。 所以我們可以做到這一點。

editText.addTextChangedListener(textWatcher1); 
editText.addTextChangedListener(textWatcher2); 

但我們不能做到這一點。(它會設置只有最後聽衆在這種情況下clickListener2)

button.setOnClickListener(clickListener1); 
button.setOnClickListener(clickListener2); 

另一個疑問

我不能想任何使用情況下,我需要兩個textWatcher單個editText。任何人都可以提供這樣的用例。 (我應該問這個問題作爲單獨的問題嗎?)

回答

17

如果你有一個set-方法通常只有一個監聽器。 (但我個人更喜歡稱他們爲「處理者」)。

隨着add-方法,你通常可以有任意數量的監聽器。

+3

+1你是一個快速的傢伙... – MByD 2011-05-02 08:32:48

+0

@aioobe所以你的意思是我可以只設置一個clickListener,但我可以在我的示例中添加多個textWatcher到一個視圖。 – Vivart 2011-05-02 08:35:15

+0

是的。鑑於方法名稱,這將是我的解釋。您應該仔細閱讀API文檔以確保。 – aioobe 2011-05-02 08:41:02

1

aioobe當然是對的。但有一個附加的考慮:

根據標準

  • getX/isXyzsetXyz限定 屬性(見 PropertyDescriptor),但
  • addXyzListenerremoveXyzListenergetXyzListeners也 標準命名JavaBeans的事件 聽衆的約定(見 EventSetDescriptor

所以setXyzListener()不是根據JavaBeans標準設置偵聽器的有效方法名!當然,你可能會故意選擇違反JavaBeans標準,但我試圖阻止你無意中做到這一點:-)

0

在我看來,沒有什麼好的理由讓setXxxListener方法代替addXxxListener。我確信這些「設置」方法僅僅是因爲程序員的懶惰而存在。真的很傷心,因爲支持一個聽衆名單並不比支持單個聽衆困難得多。可能確實,你通常只期望一個感興趣的聽衆,但是支持他們的列表有很多很好的理由。

我最喜歡的需要監聽列表的例子是支持調試。您可能想要添加診斷監聽器來監視某個活動,但只有setXxxListener方法,調試操作可能會破壞您的代碼!底線是,在編寫一個可觀察的類時,你不想對它將如何使用做出不必要的假設。

下面是一些可觀察到的類調用爲MyModel樣板:

public interface MyModelChangeListener { public void changed(MyModel model); } 
private ArrayList<MyModeChangeListener> listeners = new ArrayList<MyModeChangeListener>(); 
public void addMyModeChangeListener(MyModeChangeListener tcl) { listeners.add(tcl); } 
public void removeMyModeChangeListener(MyModeChangeListener tcl) { listeners.remove(tcl); } 
protected void fireMyModeChange() { for(MyModeChangeListener mmcl : listeners) mmcl.changed(this); } 

有意者根據需要添加監聽器,併爲MyModel實施和任何子類只需撥打

fireMyModeChange(this) whenever their observable states change. 

我創建issue 5711在Android項目問題跟蹤器中解決這個問題。如果您認爲這應該在整個Android SDK中得到解決,請將其加上星號並在其中添加您自己的評論。

0

addListener是Java bean標準,setListener是Android標準,兩者都在不同的上下文中使用。 addListner僅用於Desktop和Web編程,因爲這裏我們必須完全處理很多組件。在Android中,使用setListener是因爲在這裏我們有一個活動。在某些方面,我們使用addListiner像addTextWatcher,這是因爲在單個活動中我們必須處理許多EditText。