java - Android 上 EditText 的一次性 OnFocusChangeListener

标签 java android memory-model

我需要为我的 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/

相关文章:

java - 字节码操作模式

java - 如何在我的主类中创建一个 switch 语句,当选择该情况时将在我的程序中运行另一个主类?

java - 为什么在java内存模型下java.lang.Class.newInstance0()不是严格正确的?

javascript - 在网页中使用 zxing Barcode Scanner

Java规范: reads see writes that occur later in the execution order

c++ - "strongly happens before"是什么意思?

java - 将 ListView 限制为 25 个项目

java - 显示数组时数组元素给出 null 和 0

android - 无法将应用程序移动到 SD 卡

android - 权限拒绝 : writing com. sec.android.provider.badge.BadgeProvider