Android开发中软键盘的显示和隐藏

  

本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示软键盘的实现方法,并且对其中重要的代码做了详细分析。

  

  

如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求。开篇明义,本文会讲讲弹出和收起软键盘的一些细节,最终还会从源码进行分析。

  

想要操作软键盘,需要使用到InputMethodManager,它是一个系统服务,可以使用<代码> Context.getSystemService() 获取到它。而很多关键的逻辑代码,都是在InputMethodManagerService中实现的。

  

特别说明:本文的所有分析的源码,都是基于Android 26的源码。

  

  

2.1 InputMethodManager   

前面提到,想要操作软键盘,需要使用InputMethodManager,它是一个系统服务,想要获取它,可以使用<代码> getSystemService() ,获取到它。

  

 Android开发中软键盘的显示和隐藏

  

毕竟是系统服务,使用的时候为了安全,还是要判空,避免空指针。

  

2.2显示软键盘

  

在InputMethodManager中,有两个方法<代码> showSoftInput() 和<代码> showSoftInputFromInputMethod()> showSoftInput() 是有效的。

  

它有两个重载方法,而通常我们会使用它的两个参数的方法。

  

 Android开发中软键盘的显示和隐藏

  

这里我们只需要传递两个参数。它首先需要一个视图,使用软键盘就是为了输入,而输入就需要有接收输入内容的观点,这里接收输入的观点,最好是一个EditText(但这不是必须的)。

  

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

  

 Android开发中软键盘的显示和隐藏

  

可以看到1、2都是有特殊含义的,实际上它们并不影响显示,只是在隐藏的时候,会有一些限制,这些后面看源码的时候再说,一般没有特别需要的话,我们直接传递0就好了。

  

现在,简单总结一下调用<代码> showSoftInput() 会生效的关键点:

  

1,第一个参数,最好是EditText或者它的子类。

  

考虑到软键盘就是为了输入,EditText就是一个接收输入的控件。而这不是绝对的,如果不是一个EditText,就必须要求这个观点有两个属性,分别是:<代码> android: focusable=" true " 和<代码> android: focusableInTouchMode=" true ">   

2,第一个参数,必须是可获取焦点的,并且当前已经获取到焦点。

  

EditText默认是允许获取焦点的,但是假如布局中,存在多个可获取焦点的控件,就需要提前让我们传递进去的视图获取到焦点。获取焦点可以使用requestFocus() <代码> 方法。

  

3,布局必须加载完成。

  

在<代码> onCreate() 中,如果立即调用<代码> showSoftInput() 是不会生效的。想要在页面一启动的时候就弹出键盘,可以在活动上,设置<代码> android: windowSoftInputMode 属性来完成,或者做一个延迟加载,<代码> View.postDelayed() 也是一个解决方案。

  

所以最终,完整的显示软键盘的代码就如下所示了。

  

 Android开发中软键盘的显示和隐藏

  

2.3隐藏软键盘

  

虽然<代码> showSoftInput() 方法是有效的,但是想要隐藏软键盘,就没有提供对应的<代码> hideSoftInput() 方法,但是却有一个<代码> hideSoftInputFromWindow() 方法,可以用来隐藏软键盘。

  

先来看看这个方法的签的名,它同样有两个方法可以调用。

  

 Android开发中软键盘的显示和隐藏

  

它接收两个参数,第一个参数是一个内部,可以直接传递一个<代码> View.getWindowToken() 的windowToken对象就可以了。而第二个参数,就是隐藏软键盘的标志位,如果没有特殊要求的话,直接传递0就好了。

  

注意这里虽然原则上需要传递一个之前弹出键盘传递的时候,传递的视图的windowToken,但是实际情况是你只需要传递一个存在于当前布局ViewTree中,随意一个视图的windowToken就可以了。

Android开发中软键盘的显示和隐藏