可以看到 1、2 都是有特殊含义的,实际上它们并不影响显示,只是在隐藏的时候,会有一些限制,这些后面看源码的时候再说,一般没有特别需要的话,我们直接传递 0 就好了。
现在,简单总结一下调用 showSoftInput()
会生效的关键点:
1、第一个参数,最好是 EditText 或者它的子类。
考虑到软键盘就是为了输入,EditText 就是一个接收输入的控件。而这不是绝对的,如果不是一个 EditText ,就必须要求这个 View 有两个属性,分别是:android:focusable="true"
和android:focusableInTouchMode="true"
。
2、第一个参数,必须是可获取焦点的,并且当前已经获取到焦点。
EditText 默认是允许获取焦点的,但是假如布局中,存在多个可获取焦点的控件,就需要提前让我们传递进去的 View 获取到焦点。获取焦点可以使用 requestFocus()
方法。
3、布局必须加载完成。
在 onCreate()
中,如果立即调用 showSoftInput()
是不会生效的。想要在页面一启动的时候就弹出键盘,可以在 Activity 上,设置 android:windowSoftInputMode
属性来完成,或者做一个延迟加载,View.postDelayed()
也是一个解决方案。
所以最终,完整的显示软键盘的代码就如下所示了。
2.3 隐藏软键盘
虽然 showSoftInput()
方法是有效的,但是想要隐藏软键盘,就没有提供对应的 hideSoftInput()
方法,但是却有一个 hideSoftInputFromWindow()
方法,可以用来隐藏软键盘。
先来看看这个方法的签名,它同样有两个方法可以调用。
它接收两个参数,第一个参数是一个 IBinder ,可以直接传递一个 View.getWindowToken()
的 windowToken 对象就可以了。而第二个参数,就是隐藏软键盘的标志位,如果没有特殊要求的话,直接传递 0 就好了。
注意这里虽然原则上需要传递一个之前弹出键盘传递的时候,传递的 View 的 windowToken ,但是实际情况是你只需要传递一个存在于当前布局 ViewTree 中,随意一个 View 的 windowToken 就可以了。
最终隐藏软件的代码就是这样的。
2.4 切换键盘的弹出和隐藏
在 InputMethodManager 中,还提供了一个 toggleSoftInput()
方法,如同它的名字一样,它可以让软键盘在显示和隐藏之间切换。