2017-02-24 40 views
0

我需要爲我的EditText實施一次性OnFocusChangeListener。也就是說,一旦EditText獲得焦點,它就會執行某些操作並停止收聽焦點更改事件。Android上的EditText的一次性OnFocusChangeListener

我給我的EditText分配一個ananymous OnFocusChangeListener。然後在void onFocusChange(View v, boolean hasFocus)我打電話v.setOnFocusChangeListener(null);

它的工作原理,但我想知道爲什麼它有可能在其自己的方法onFocusChangeOnFocusChangeListener爲空。我想我錯過了Java內存模型的一些東西。

的代碼如下:

mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (hasFocus) { 
      // do something 
      v.setOnFocusChangeListener(null); 
     } 
    } 
}); 
+0

據我所知,你認爲這不會導致循環。 'EditText'實現'OnFocusChangeListener'接口。您首先設置偵聽器,然後刪除該偵聽器。爲什麼會有問題? – azizbekian

+0

@azizbekian,正如我從https://developer.android.com/reference/android/widget/EditText.html看到的,'EditText'沒有實現'OnFocusChangeListener' –

+1

我的錯。 'View'中有一個靜態的內部類,叫做'ListenerInfo',它保留了這個監聽器。 [源代碼](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/View.java#L3566) – azizbekian

回答

1

不要驚慌,你不能傷害的對象。 在視圖對象中有受保護的OnFocusChangeListener mOnFocusChangeListener。讓我們說它指向你的記憶中的地址16。

您可以將新對象分配給它,它會開始點可以說,在地址29.但是執行的功能是從對象16

就在下次OS獲取焦點變化,他們將在存儲器29的對象上觸發該功能,這種方式將是你最後一次在對象16處使用該功能。

你所做的是指向null,而不是29,它的工作原理相同。 我希望我解釋得有點好...

+0

我明白了。在我調用editText.setOnFocusChangeListener(new View.OnFocusChangeListener(){}'後,受保護的字段OnFocusChangeListener持有對地址16的引用,並且在這個實例上調用onChange方法。從Java文檔?對不起,挑選,但我會使用'代碼'_保護OnFocusChangeListener mOnFocusChangeListener_而不是斜體。當我看到_protected OnFocusChangeListener mOnFocusChangeListener_,我想我想強調它。 –

+1

我沒有我的知識來源於解決工作中的問題,所以當我這樣說時,我有98%的把握,因爲它對我有用,但我從來沒有讀過它,完全可以肯定。 –