android 的软件盘
关闭软件盘:
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);}}打开软件盘:
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)
关闭当前窗口的软键盘。
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)。
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)
参数解释:
view: 你希望键盘出现在哪个输入控件上。flags: 一般用SHOW_IMPLICIT、SHOW_FORCED。
特点:
需要目标 view 已经
requestFocus();如果 view 还没 attach,可能失败。
3. toggleSoftInput(showFlags, hideFlags)
切换软键盘的显示状态。如果当前是显示状态,就关闭;如果是关闭状态,就打开。
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 所在的窗口就是目标。”
