适用于Android上的EditText的一次性OnFocusChangeListener

时间:2017-02-24 15:15:25

标签: java android memory-model

我需要为OnFocusChangeListener实施一次性EditText。即,一旦EditText获得焦点,它就会做某事并停止倾听焦点变化事件。

我为我的OnFocusChangeListener分配了一个空的EditText。然后在void onFocusChange(View v, boolean hasFocus)我致电v.setOnFocusChangeListener(null);

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

代码如下:

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

1 个答案:

答案 0 :(得分:1)

不要惊慌,你不能伤害对象。 View对象中有 protected OnFocusChangeListener mOnFocusChangeListener 。让我们说它在你的记忆中指出16。

您可以为其分配新对象,它将从地址29开始指向。但运行的函数来自对象16。

下一次操作系统获得焦点更改时,它们将在内存29处的对象上触发该函数,这将是您最后一次将该函数用于16处的对象。

你所做的是指向null,而不是29,它的工作方式相同。 我希望我解释得很好......