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,它的工作原理是一样的。
我希望我解释得很好...
我需要为我的 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,它的工作原理是一样的。 我希望我解释得很好...