我需要为我的 EditText
实现一次性 OnFocusChangeListener
。即,一旦 EditText
获得焦点,它就会执行某些操作并停止监听焦点更改事件。
我将一个任意的 OnFocusChangeListener
分配给我的 EditText
。然后在 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);
}
}
});
最佳答案
不要 panic ,你无法伤害该物体。 View对象中有 protected OnFocusChangeListener mOnFocusChangeListener。假设它指向你内存中的地址 16。
您可以为其分配新对象,并且它将开始指向地址 29 处。但是运行的函数来自对象 16。
下次操作系统获得焦点变化时,它们将在内存 29 处的对象处触发该函数,在某种程度上,这将是您最后一次对 16 处的对象使用此函数。
你所做的是指向 null,而不是 29,它的工作原理是一样的。 我希望我解释得很好......
关于java - Android 上 EditText 的一次性 OnFocusChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42442104/