在Android中隐藏键盘的最佳方法是什么?

6
我希望了解在输入文本到EditText后,隐藏键盘的最佳方法。
1)setonfocuschangelistener:此监听器仅在按下完成按钮或从一个EditText切换到另一个EditText时才触发吗?当我使用这种方法时,我无法隐藏键盘。
2)setOnTouchListener:当我使用此方法时,我可以隐藏键盘,但我怀疑可能会出现问题。在这种情况下,我将触摸侦听器添加到根LinearLayout中。以下是我使用的代码:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

    txtUserName = (EditText)findViewById(R.id.txtUserName);
    btnLogin = (Button)findViewById(R.id.btnLogin);
    layoutView = (LinearLayout)findViewById(R.id.li);

    layoutView.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            inputManager.hideSoftInputFromWindow(txtUserName
                    .getWindowToken(), 0);
            return true;
        }
    });
}

在主LinearLayout中,我使用了其他两个LinearLayout。上面的代码问题是,在某些时候当我按下键盘时它不会隐藏。 我的疑问是,我只为根布局添加了触摸监听器,没有给其他内部布局或其他控件(TextView)添加触摸监听器。当我触摸到其他控件或TextView周围的某些点(即内部布局)时,键盘不会隐藏。
这意味着我需要为根布局内的所有布局或控件添加touchListener吗? 如何更好地处理这种情况?

感谢各位朋友的回复。我们可以使用上面的代码来隐藏键盘。我犯的错误是将触摸监听器添加到内部布局之一,而不是根布局。因此,我希望这也是一种最好的方法,在EditText外部触摸时隐藏键盘。再次感谢所有人的回复。因此,如果有任何用户有特权将其标记为正确答案,请在验证代码后执行。 - sree_iphonedev
5个回答

15

你可以使用这段代码

InputMethodManager imm = 
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditView.getWindowToken(), 0);

3
如果键盘没有显示,这个会导致空指针异常。请修复此问题。 - Ajith M A
1
@AjithMemana 实际上它不会引发任何异常,我已经尝试过并查看了文档。谢谢。 - waseemwk
@john-aziz57 请查看这里 https://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html - waseemwk

9

我对这个问题的回答:

添加这个方法:

public static void hideSoftKeyboard(Activity activity) {
  InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
  inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

如果你想在触摸屏幕时隐藏键盘,可以通过以下方式实现:

@Override
public boolean onTouchEvent(MotionEvent event) {
 hideSoftKeyboard(LoginActivity.this);
 return false;
}

希望这可以帮助您。

5
尝试这个:

试试看:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

它可以用于在用户实际触摸EditText视图之前抑制键盘。

或者

 inputManager.hideSoftInputFromWindow(editView.getWindowToken(), 0);

我之前也尝试过这个。但是它没有起作用。我的疑问是,除了你的代码片段之外,我是否需要添加任何其他代码?如果您能提供一小段说明它是如何工作的,而不是仅仅一行代码,那就更好了。 - sree_iphonedev
在我解释之后,请尝试这个。 - Ronak Mehta

2

如果没有视图聚焦,一个简单的null检查或try-catch可以避免NullPointerException

public void hideKeyboard(Activity activity) {
    InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (activity.getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(activity.getCurrentFocus()
                    .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
        }
}

-1

隐藏键盘的最佳方法是在您的活动中使用dispatchDoneKey。如果键盘处于可见状态,它将被隐藏。

public void dispatchDoneKey() {
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
    dispatchKeyEvent(new KeyEvent (KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
}

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