Android之InputMethodManager介绍

2021-12-06 17:53:31 浏览数 (2)

InputMethodManager

Android主要用InputMethodManager来对软键盘进行管理。

InputMethodManager整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互。

可以用Context.getSystemService()取得这一接口的实例。

代码语言:javascript复制
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
    //...
}

为了避免NullPointException,需要判断imm实例是否为null。

显示软键盘

显示软键盘有三个方法:

代码语言:javascript复制
boolean showSoftInput (View view, int flags)
boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)
void showSoftInputFromInputMethod (IBinder token, int flags)

一般情况使用第一个方法,即两个参数的showSoftInput.

showSolftInput的resultReceiver参数用于接收完成输入后返回结果,但由于它可以长时间存在jvm里而不会被gc,使用它需要注意内存泄漏。

showSoftInputFromInputMethod使用不当会存在失效的情况。

使用实例:

代码语言:javascript复制
showKeyBoard(View view) {
  InputMethodManager imm = (InputMethodManager) veiw.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
  if (imm != null) {
    view.requestFocus();
    imm.showSoftInput(view, 0);
  }
}

showSoftInput第二个参数为flags,它是提供额外操作的标记。目前可以为两个值0和 SHOW_IMPLICIT。SHOW_IMPLICIT表示不是由用户操作引起显示软键盘的,为隐含显示。一般可以使用0。

隐藏软键盘

使用hideSoftInputFromWindow隐藏软键盘。

方法原型:

代码语言:javascript复制
boolean hideSoftInputFromWindow (IBinder windowToken, int flags)

windowToken:第一个参数可以使用View.getWindowToken()或者getWindow().getDecorView().getWindowToken()

flags:隐藏软键盘的标志位,可以传0

关闭软键盘,windowToken不需要已获取焦点的View,所以可以使用getWindow().getDecorView().getWindowToken()获取一个windowToken用于关闭软键盘。

使用例子:

代码语言:javascript复制
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
    imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}

注意:如果是使用view.getWindowToken(),此view需要被添加到布局里才行,否则不能关闭软键盘。

切换软键盘

使用toggleSoftInput方法用于切换软键盘显示和隐藏。 方法:

代码语言:javascript复制
void toggleSoftInput (int showFlags, int hideFlags)

showFlags:显示使用的标记,和showSoftInput的第二个参数flags一样。 hideFlags:隐藏使用的标记,和hideSoftInputFromWindow第二个参数一样。

使用实例:

代码语言:javascript复制
 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // 隐藏
} else {
    imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // 显示
}

0 人点赞