键盘消失时取消EditText的焦点

5
我希望实现这样一个简单的任务,当键盘被关闭时(无论是通过点击完成或返回按钮),EditText (不是隐藏光标)失去焦点。到目前为止我所能找到的只有:window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN),但它只适用于活动首次打开时。键盘关闭后,文本字段仍然处于尴尬的焦点状态。
4个回答

4

当键盘消失时,您可以监听事件,然后在该事件发生时使用 editText.clearFocus();

请参考此答案以监听键盘消失事件。


如果我有三个编辑文本并想要清除焦点,该怎么办? - Jack Guo
当键盘消失时,只需在所有视图上调用clearFocus();函数即可。很简单。 - Tomas Jablonskis
1
工作了,简直不敢相信这就是 Android 在2018年仍然运行的方式。 - Jack Guo
它确实有这些小毛病,但我们目前必须处理它。我认为未来很光明 :) - Tomas Jablonskis
如果您正在添加动态组件,则可以从父组件获取子组件,循环每个元素并清除焦点。 - Ishan Fernando
对于检查键盘是否被关闭,这个答案很简单,没有感觉像是一个hack,并且对我非常有效。https://stackoverflow.com/a/53013309/3718756 - jhwblender

3

我简直不敢相信这是我能找到的最简单的解决方案(真的,安卓吗?):

public class CustomEditText extends EditText {

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == KeyEvent.KEYCODE_ENDCALL) {
                    InputMethodManager imm = (InputMethodManager)v.getContext()
                        .getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(CustomEditText.this.getWindowToken(), 0);
                    CustomEditText.this.clearFocus();
                    return true;
                }
                return false;
            }
        });
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            this.clearFocus();
        }
        return super.onKeyPreIme(keyCode, event);
    }

}

0

您可以清除编辑文本的焦点,并管理启用/禁用编辑文本。


0

Kotlin 版本:

class CustomEditText: AppCompatEditText {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)

    override fun onKeyPreIme(keyCode: Int, event: KeyEvent?): Boolean {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            clearFocus()
        }
        return super.onKeyPreIme(keyCode, event)
    }
}

使用方法:

<com.youappdomain.view.CustomEditText
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接