Android 上 EditText 的一次性 OnFocusChangeListener

One-shot OnFocusChangeListener for an EditText on Android

我需要为我的 EditText 实施一次性 OnFocusChangeListener。也就是说,一旦 EditText 获得焦点,它就会做一些事情并停止监听焦点更改事件。

我给 EditText 分配了一个匿名的 OnFocusChangeListener。然后在 void onFocusChange(View v, boolean hasFocus) 我调用 v.setOnFocusChangeListener(null);

它有效,但我想知道为什么可以在它自己的方法 onFocusChange 中取消 OnFocusChangeListener。我想我从 Java 内存模型中遗漏了一些东西。

代码如下:

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

不要惊慌,你不能伤害对象。 View对象中有protected OnFocusChangeListener mOnFocusChangeListener。假设它指向您内存中的地址 16。

你可以给它分配新的对象,它会开始指向地址 29。但是运行的函数来自对象 16。

下一次 OS 获得焦点更改时,它们将触发内存 29 处对象的函数,从某种意义上说,这将是您最后一次对 16 处的对象使用此函数。

你做的是指向 null,而不是 29,它的工作原理是一样的。 我希望我解释得很好...