有输入框 EditText 的界面,如何处理软键盘的弹出/收起

现象

  • 如果界面上有 EditText 控件,则它会自动获取焦点并使软键盘弹出
  • 与界面上其他控件进行交互(触摸、点击)时,软键盘不会自动隐藏

解决方案

1.监听 EditText 的焦点变化,如果丢失焦点,则自动隐藏软键盘
2.为界面上其他控件设置属性:可以获取焦点,这样在你与其他控件交互时,它们就会获取焦点,触发 EditText 焦点变动监听器,隐藏软键盘

代码实现:

1.监听 EditText 焦点变化

editText.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        //当EditText失去焦点时,隐藏软键盘
        if (!hasFocus) {
            closeKeyBoard
        }
    }
});

2.设置界面上其他控件可以获得焦点(XML)

android:focusable="true"
android:focusableInTouchMode="true"

3.弹出软键盘

/**
 * 弹出软键盘
 */
private void showKeyBoard() {
    InputMethodManager imm = (InputMethodManager) MyApplication.getInstances().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}

4.收起软键盘

/**
 * 收起软键盘
 */
public static void closeKeyBoard() {
    InputMethodManager inputMethodManager = (InputMethodManager) MyApplication.getInstances().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}