Activity 软键盘显示与隐藏的控制

默认情况下打开 Activity 是不会弹起软键盘的,即使页面布局上有个获取了焦点的输入框。但我们可以通过在 xml 中配置 Activity 标签的 windowSoftInputMode 属性来进行软键盘与 Activity 的交互方式控制。

这个属性对应的值主要分两类,一类用于控制软键盘的显示或隐藏,另一类用于调整软键盘与 Activity 内容展示区域。两类值可以单独使用,也可以组合使用,但如果多个同类型的组合使用,可能达不到预期效果。

state- 类

用于控制打开 Activity 后,软键盘的显示还是隐藏。

stateUnspecified 默认的方式,由系统根据情况展示还是隐藏

stateVisible 打开 Activity 如果有输入框的话,就会显示软键盘(不过我实际试了下,并没有弹出来,难道是我的页面布局太复杂了?)

stateAlwaysVisible 比 stateVisible 更强烈些吧,在跳转到别的页面返回时也会弹起,而 stateVisible 不会。

stateHidden 与 stateVisible 对应

stateAlwaysHidden 与 stateAlwaysVisible 对应

stateUnchanged 保持 Activity 退到后台时的软键盘状态,在 Activity 回到前台时,原来显示的就显示,原来隐藏的就隐藏

adjust- 类

用于调整软键盘窗口与 Activity 布局内容的展示区域。

adjustUnspecified 默认的调整方式,由系统决定具体的内容展示区域

adjustResize 留出空间给软键盘展示,剩余屏幕展示 Activity 内容,软键盘窗口与 Activity 页面内容不重叠,导致页面会被压缩的感觉。这种调整适合的场景我觉得首先要满足页面内容较少,或需要用户输入完内容不用收起软键盘就可以继续点击操作的这一类。

adjustPan 这个确保焦点输入始终是可见的,并不会像 adjustResize 那样把内容顶上去,会有一部分重叠。这种调整我觉得更适合页面内容比较多,想让用户看内容的页面。

adjustNothing 这个官方文档里没说,试了下效果,和 adjustPan 有点类似,但就像名字里 Nothing 说的,可能就是让软键盘窗口叠在页面上。

代码里控制软键盘的显示与隐藏

测试了一下 state- 类的各个值,效果并不像官方文档描述的那样,也可能是我哪里配置不对。在这种情况下我觉得还是通过 InputMethodManager 代码控制软键盘的显示与隐藏比较靠谱。一般这样的代码会被抽成工具方法,可以 github 一下,我用的是这个还不错,集成了很多工具方法,Blankj 的工具集

其实关于软键盘与 Activity 布局内容的交互实现上,我觉得很大一部分需要根据实际情况来调整,没法做到一招鲜。

这次项目里碰到两个问题,

  1. 通过继承 WebView 加载 H5 页面,发现需要软件盘输入时,弹不起软键盘,查了才知道构造方法还有这层关系 Android 自定义WebView点击输入框不弹出软键盘

  2. H5 页面里有个从底部弹起的带搜索框的弹窗,现在软键盘是弹起来了,但是软键盘弹起来把弹窗顶上去,被标题栏遮挡了搜索框。配置了一下软键盘调整方式,发现 adjustPan 和 adjustNothing 都有效,不过我还是用了 adjustNothing。

参考内容

处理输入法可见性
windowSoftInputMode 属性
Android 软键盘之 windowSoftInputMode 分析

你可能感兴趣的:(Activity 软键盘显示与隐藏的控制)