点击外部edittext以失去焦点

Jus*_*ous 40 android focus android-edittext

我只想在"edittext"外单击时自动失去焦点并隐藏键盘.目前,如果我点击"edittext"它会聚焦,但我需要点击后退按钮来取消聚焦.

Sud*_*aur 22

要解决此问题,您需要首先使用该Edittext的setOnFocusChangeListener

edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    Log.d("focus", "focus lost");
                    // Do whatever you want here
                } else {
                    Log.d("focus", "focused");
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

然后你需要做的是覆盖包含Edittext的活动中的dispatchTouchEvent,见下面的代码

@Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if ( v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    Log.d("focus", "touchevent");
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent(event);
    }
Run Code Online (Sandbox Code Playgroud)

现在会发生什么事情,当用户点击外面时,首先调用dispatchTouchEvent,然后从editext清除焦点,现在你的OnFocusChangeListener将被调用焦点已被更改,现在你可以做任何你想做的事情,希望它有效:)

  • @Stack 实际上是“焦点丢失”:) (9认同)

lyn*_*ilu 18

@woodshy有隐藏键盘的答案,但也许放入代码onClick不如放入键盘onFocusChanged.至于强制它失去焦点,您需要在其XML文件中设置要将焦点转移到的对象:

android:focusable="true"
android:focusableInTouchMode ="true"
Run Code Online (Sandbox Code Playgroud)


woo*_*shy 14

假设您的EditText放置在线性布局或其他ViewGroup上.然后你应该使这个容器可点击,可聚焦和focusableInTouchMode.之后使用onClick Override方法将onClickListener设置为此容器,并使用以下代码:

@Override
public void onClick(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
Run Code Online (Sandbox Code Playgroud)