Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnFocusChange并不总是有效的_Android_Focus_Android Edittext - Fatal编程技术网

Android OnFocusChange并不总是有效的

Android OnFocusChange并不总是有效的,android,focus,android-edittext,Android,Focus,Android Edittext,在我的一项活动中,我有三个EditTexts和一个OK按钮。OnFocusChangeListener设置为所有三个EditTexts。每次焦点丢失时,侦听器都应该触发 在EditTexts之间切换非常有效。但如果用户按下OK按钮,则不会触发EditText用户在按下按钮前聚焦的焦点更改(失去焦点) 我的代码怎么了 private class MyOnFocusChangeListener implements OnFocusChangeListener { private EditTe

在我的一项活动中,我有三个
EditText
s和一个OK按钮。
OnFocusChangeListener
设置为所有三个
EditText
s。每次焦点丢失时,侦听器都应该触发

EditText
s之间切换非常有效。但如果用户按下OK按钮,则不会触发
EditText
用户在按下按钮前聚焦的焦点更改(失去焦点)

我的代码怎么了

private class MyOnFocusChangeListener implements OnFocusChangeListener {
    private EditText editText;

    public MyOnFocusChangeListener(final EditText editText) {
        super();

        this.editText = editText;
    }

    @Override
    public void onFocusChange(final View view, final boolean isFocused) {
        if (!isFocused) {
            if (editText == editText1) {
                // Do a calculation
            } else if (editText == editText2) {
                // Do another calculation
            } else if (editText == editText3) {
                // Do a different calculation
            }
        }
    }
}

@Override
public void onCreate(final Bundle bundle) {
    // ...
    editText1.setOnFocusChangeListener(new MyOnFocusChangeListener(editText1));
    editText2.setOnFocusChangeListener(new MyOnFocusChangeListener(editText2));
    editText3.setOnFocusChangeListener(new MyOnFocusChangeListener(editText3));
    // ...
}

您可以尝试在用户单击“确定”或其他按钮时清除焦点

e、 g


听起来您可能在触摸模式方面有问题,从:


“触摸模式、选择和焦点之间的关系意味着您不能依赖选择和/或焦点来存在于应用程序中。”

在这种情况下,您可能需要尝试使用:(..)。

如果您将FocusChangeListener绑定到要观察的视图元素,则它会起作用

editText.onFocusChangeListener = this
editText.setOnClickListener(this)

通过关键字
意味着
视图持有者

在@dong221上展开,并结合@Harald的评论,一种清除焦点而不必跟踪最后选择的
编辑文本
的方法是从
窗口
对象获取对
当前焦点
的引用。大概是这样的:

myDoneButton.setOnClickListener { v -> 
    // Assuming we are in an Activity, otherwise get a reference to the Activity first
    window.currentFocus?.clearFocus()
}

谢谢你的回答。这真的很糟糕,因为我必须在两个糟糕的场景中做出选择。1.)仅当用户在点击“确定”按钮之前输入不同的编辑文本时,才会进行计算(默认情况下,按钮不可聚焦)。2.)将按钮更改为可聚焦,以便用户必须按两次按钮。后者比前者更有效,因为用户可能会在1.)中存储未计算的值。也许你应该稍微重新考虑一下应用程序的设计,它到底想做什么?当重新设计有助于解决问题时,代码可能过于复杂。代码也有一些问题,不需要创建焦点侦听器并将edittext传递给构造函数。调用onFocusChanged时,它将向您传递焦点已更改的视图,只需将view参数强制转换为编辑文本(首先检查其类型!)。链接给出:“错误404-找不到文件”。这可能会在所有三个EditText上触发OnFocusChange,因此我无法使用它。但这帮助我找到了更好的方法。现在,我将获取焦点的EditText存储在类成员中,单击按钮后,我清除特定EditText的焦点。这很有魅力。谢谢。
myDoneButton.setOnClickListener { v -> 
    // Assuming we are in an Activity, otherwise get a reference to the Activity first
    window.currentFocus?.clearFocus()
}