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 所在的窗口就是目标。”