OnFocusChange并不总是有效

时间:2012-02-24 08:20:17

标签: android focus android-edittext

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

EditText之间切换完美无缺。但是,如果用户按下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));
    // ...
}

5 个答案:

答案 0 :(得分:8)

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

e.g。

 builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() 
 {
     public void onClick(DialogInterface dialog, int whichButton) 
     {
          editText1.clearfocus();
          editText2.clearfocus();
          editText3.clearfocus();
          ....
     }
 }

答案 1 :(得分:2)

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

答案 2 :(得分:1)

听起来您可能会遇到触摸模式问题,来自android docs

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

答案 3 :(得分:0)

如果将onFocusChangeListener绑定到要观察的视图元素上,它将起作用

editText.onFocusChangeListener = this
editText.setOnClickListener(this)

通过关键字this表示ViewHolder

答案 4 :(得分:0)

要扩展@ dong221并结合@Harald的评论,一种无需关注上次选择的EditText即可清除焦点的方法是获取对currentFocus的引用来自window对象。像这样:

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