关闭软件盘:
Kotlin
public static void hideKeyboard(Context context, View v) {
if (context == null) {
return;
}
if (v != null && v.getWindowToken() != null) {
InputMethodManager im = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
打开软件盘:
Kotlin
public static void openKeybord(EditText mEditText, Context mContext) {
if (mContext == null || mEditText == null) {
return;
}
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}
hideSoftInputFromWindow和showSoftInput和toggleSoftInput区别
这三个方法都是 InputMethodManager
提供的,用于控制 Android 的软键盘(输入法)。它们的作用分别是:
🧩 方法区别一览
方法 | 作用 | 典型用途 | 是否需要 View |
---|---|---|---|
hideSoftInputFromWindow(token, flags) |
关闭软键盘 | 用户点击空白区域等情况 | ✅ 需要 window token |
showSoftInput(view, flags) |
显示软键盘 | 用户点击输入框后手动弹出 | ✅ 需要目标 View |
toggleSoftInput(showFlags, hideFlags) |
🔍 详细说明
1. hideSoftInputFromWindow(windowToken, flags)
关闭当前窗口的软键盘。
Kotlin
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
-
参数解释:
-
windowToken
: 通常来自当前焦点 view 的getWindowToken()
。 -
flags
: 通常传0
,也可用HIDE_NOT_ALWAYS
等。
-
-
特点:
-
你需要明确知道是哪个窗口(通过 view);
-
适合"点击空白区域关闭键盘"等场景。
-
2. showSoftInput(view, flags)
主动为指定的
View
显示软键盘(一般是EditText
)。
Kotlin
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
-
参数解释:
-
view
: 你希望键盘出现在哪个输入控件上。 -
flags
: 一般用SHOW_IMPLICIT
、SHOW_FORCED
。
-
-
特点:
-
需要目标 view 已经
requestFocus()
; -
如果 view 还没 attach,可能失败。
-
3. toggleSoftInput(showFlags, hideFlags)
切换软键盘的显示状态。如果当前是显示状态,就关闭;如果是关闭状态,就打开。
Kotlin
imm.toggleSoftInput(0, 0)
-
参数解释:
-
showFlags
: 比如SHOW_FORCED
; -
hideFlags
: 比如HIDE_NOT_ALWAYS
; -
通常两个都传
0
。
-
-
特点:
-
不需要传 View;
-
不保证显示的是哪个 View 的输入;
-
多用于"快捷开关"或"无焦点界面"的情况。
-
view.getWindowToken()是什么?为什么必须传?
getWindowToken()
是 Android 中 View
类的一个方法,它返回一个 IBinder
对象,表示这个 View
所附着的 窗口的令牌(token)。
getWindowToken()
表示这个 View
当前所在的 窗口标识,用于系统识别这个 View 属于哪个窗口。
📦 举个比喻:
想象你有多个 Activity 或 Dialog,它们都可能打开键盘。getWindowToken()
就像是给你一个"窗口的身份证",告诉系统:
"我要关闭键盘,这个 View 所在的窗口就是目标。"