本文参照 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()可以实现显示键盘,先来看看它的两个参数。
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的两个参数。
IBinder: 可以直接传递一个 View.getWindowToken() 的 windowToken 对象就可以了
flags: 隐藏软键盘的标志位,如果没有特殊要求的话,直接传递 0 就好了。
注意: 第一参数理论上需要传递弹出键盘相应的View的windowToken ,但实际情况是你只需要传递一个存在于当前布局 ViewTree 中,随意一个 View 的 windowToken 就可以了
如上图所示,键盘是由第一个Edittext聚焦后弹出的,当点击Hide Keyboard按钮调用hideSoftInputFromWindow方法时,第一个参数传的是第二个Edittext的windowToken ,但也能把键盘隐藏掉。
3. 切换键盘的弹出和隐藏
在 InputMethodManager 中,还提供了一个 toggleSoftInput() 方法,如同它的名字一样,它可以让软键盘在显示和隐藏之间切换。
虽然这个方法,限制很少,但是我们基本上不会使用它。主要原因在于,它是一个开关的方法,会根据当前的状态做相反的操作。这就导致很多时候,我们在代码中,无法直接根据 InputMethodManager 提供的方法判断当前软键盘的显示状态,这样也就无法确定调用它的时候的效果了。
4. 如何判断键盘是否弹出
InputMethodManager 没有提供判断键盘是否弹出的调用方法,如果想要监听键盘的弹出和收起,可以使用 ViewTreeObserver.OnGlobalLayoutListener 这个监听,来监听布局的调整,从而判断出键盘的弹出和隐藏。
这一点我在Android软键盘-弹起时布局向上拉-登录界面时有提及,有兴趣的可以去看看。