Android软键盘-显示隐藏软键盘

本文参照 Android 软键盘的显示和隐藏,这样操作就对了进行整理修正

Android软键盘系列:

我们使用InputMethodManager来实现Android中显示和隐藏软键盘的工作,几句代码就可以完成显示和隐藏键盘的操作,比较简单。
个人认为有两个点需要大家先留意一下:

  • 布局必须加载完成。在 onCreate() 中,如果立即调用 showSoftInput() 是不会生效的。想要在页面一启动的时候就弹出键盘,可以在 Activity 上,设置 android:windowSoftInputMode 属性来完成,或者做一个延迟加载,View.postDelayed() 也是一个解决方案。
  • 调用隐藏键盘的方法hideSoftInputFromWindow()时,第一个参数理论上需要传递弹出键盘相应的View的windowToken ,但实际情况是你只需要传递一个存在于当前布局 ViewTree 中,随意一个 View 的 windowToken就可以了

以下进行详细介绍

1. Show Keyboard

先上代码

 public static void showKeyboard(View view) {
        InputMethodManager imm = (InputMethodManager) view.getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            view.requestFocus();
            imm.showSoftInput(view, 0);
        }
    }

调用InputMethodManager的showSoftInput()可以实现显示键盘,先来看看它的两个参数。


image.png

View: 使用软键盘就是为了输入,而输入就需要有接收输入内容的 View ,这里接收输入的 View ,最好是一个 EditText(但这不是必须的)。

flags: flags 就是个标志位,从上面截图的方法签名上的文档上可以看到,它接收 0 或者 SHOW_INPYT_IMPLICIT 两个参数,但是实际上,它有第三个参数,另外一个是 SHOW_FORCED。

以下是需要注意的使showSoftInput生效的关键点:

  • 第一个参数,最好是 EditText 或者它的子类。
    考虑到软键盘就是为了输入,EditText 就是一个接收输入的控件。而这不是绝对的,如果不是一个 EditText ,就必须要求这个 View 有两个属性,分别是:android:focusable="true" 和android:focusableInTouchMode="true"。
  • 第一个参数,必须是可获取焦点的,并且当前已经获取到焦点。
    EditText 默认是允许获取焦点的,但是假如布局中,存在多个可获取焦点的控件,就需要提前让我们传递进去的 View 获取到焦点。获取焦点可以使用 requestFocus() 方法。
  • 布局必须加载完成。
    在 onCreate() 中,如果立即调用 showSoftInput() 是不会生效的。想要在页面一启动的时候就弹出键盘,可以在 Activity 上,设置 android:windowSoftInputMode 属性来完成,或者做一个延迟加载,View.postDelayed() 也是一个解决方案。

打开Activity时默认下打开或关闭软键盘,可以通过设置清单文件实现

 <activity
            android:name=".ActivityKeyboardActivity"
            android:windowSoftInputMode="stateVisible"
            />

stateVisible:打开。
stateHidden:关闭(默认)。

2. Hide Keyboard

先上代码

   public static void hideKeyboard(View view){
        InputMethodManager imm = (InputMethodManager) view.getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(),0);
        }
    }

同样来看看hideSoftInputFromWindow的两个参数。

image.png

IBinder: 可以直接传递一个 View.getWindowToken() 的 windowToken 对象就可以了
flags: 隐藏软键盘的标志位,如果没有特殊要求的话,直接传递 0 就好了。
注意: 第一参数理论上需要传递弹出键盘相应的View的windowToken ,但实际情况是你只需要传递一个存在于当前布局 ViewTree 中,随意一个 View 的 windowToken 就可以了
image.png

如上图所示,键盘是由第一个Edittext聚焦后弹出的,当点击Hide Keyboard按钮调用hideSoftInputFromWindow方法时,第一个参数传的是第二个Edittext的windowToken ,但也能把键盘隐藏掉。

3. 切换键盘的弹出和隐藏

在 InputMethodManager 中,还提供了一个 toggleSoftInput() 方法,如同它的名字一样,它可以让软键盘在显示和隐藏之间切换。
虽然这个方法,限制很少,但是我们基本上不会使用它。主要原因在于,它是一个开关的方法,会根据当前的状态做相反的操作。这就导致很多时候,我们在代码中,无法直接根据 InputMethodManager 提供的方法判断当前软键盘的显示状态,这样也就无法确定调用它的时候的效果了。

4. 如何判断键盘是否弹出

InputMethodManager 没有提供判断键盘是否弹出的调用方法,如果想要监听键盘的弹出和收起,可以使用 ViewTreeObserver.OnGlobalLayoutListener 这个监听,来监听布局的调整,从而判断出键盘的弹出和隐藏。
这一点我在Android软键盘-弹起时布局向上拉-登录界面时有提及,有兴趣的可以去看看。

推荐阅读更多精彩内容