记一次页面有EditText时,键盘弹出的问题
先来看一下在 Manifest 文件里面的 Activity 里面的这个属性
android:windowSoftInputMode="adjustPan|stateHidden"
复制代码
以下介绍部分属于来自官方文档
这个属性是 Android 1.5之后推出的,主要是为了 Activity 与软键盘的交互,主要的作用有两个:
- 当 Activity 成为用户注意的焦点时软键盘的状态 — 隐藏还是可见。
- 对 Activity 主窗口所做的调整 — 是否将其尺寸调小以为软键盘腾出空间,或者当窗口部分被软键盘遮挡时是否平移其内容以使当前焦点可见。
该设置必须是下表所列的值之一,或者是一个“state...”值加上一个“adjust...”值的组合。 在任一组中设置多个值(例如,多个“state...”值)都会产生未定义结果。各值之间使用垂直条 (|) 分隔。
这里的意思就是,正常会有下面的几种组合形式
- adjust...
- adjust...+state...
- state...
而不能写成
- adjust...
- state...
比如
<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
复制代码
属性介绍:
- stateUnspecified:不指定软键盘的状态(隐藏还是可见)。 将由系统选择合适的状态,或依赖主题中的设置。这是对软键盘行为的默认设置。
- stateUnchanged:当这个 activity 出现时,软键盘将一直保持在上一个 activity 里的状态,无论是隐藏还是显示
- stateHidden:用户选择打开新 activity 时,软键盘总是被隐藏,如果是从另外一个 Activity 返回时,采用默认值(官网描述:当用户选择 Activity 时 — 也就是说,当用户确实是向前导航到 Activity,而不是因离开另一 Activity 而返回时 — 隐藏软键盘。)
- stateAlwaysHidden:当该 Activity 主窗口获取焦点时,软键盘也总是被隐藏的
- stateVisible:在正常的适宜情况下(当用户向前导航到 Activity 的主窗口时)显示软键盘。
- stateAlwaysVisible:当用户选择 Activity 时 — 也就是说,当用户确实是向前导航到 Activity,而不是因离开另一 Activity 而返回时 — 显示软键盘。
- adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示(官网描述:不指定 Activity 的主窗口是否调整尺寸以为软键盘腾出空间,或者窗口内容是否进行平移以在屏幕上显露当前焦点。 系统会根据窗口的内容是否存在任何可滚动其内容的布局视图来自动选择其中一种模式。 如果存在这样的视图,窗口将进行尺寸调整,前提是可通过滚动在较小区域内看到窗口的所有内容。 这是对主窗口行为的默认设置。)
- adjustResize:该 Activity 总是调整屏幕的大小以便留出软键盘的空间
- adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分(官网描述:不调整 Activity 主窗口的尺寸来为软键盘腾出空间, 而是自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。 这通常不如尺寸调正可取,因为用户可能需要关闭软键盘以到达被遮盖的窗口部分或与这些部分进行交互。)
我遇到的问题
我在首页点击按钮进入下个页面,进去之后自动弹出软键盘,返回页主页面有两种方式
方式一
按返回键,先收起软键盘,再按一次,返回主页面,这种情况是没有问题的
方式二
直接点击导航栏的返回按钮,返回主页面,这种情况确实返回了主页面,但是软键盘却没有自动收起。我主页面的 Activity 是设置的
android:windowSoftInputMode="adjustPan|stateHidden"
复制代码
设置成这两个属性是因为主页面有个输入框,如果不设置的话,输入框弹起的时候,会把底部的 tab 栏顶上来。
从上面的属性说明来看,adjustPan 是正常的,可以很好的解决我键盘弹出时,把底部 tab 栏顶上来的 bug,
那么问题主要就出在 stateHiden 这里,由于我这个是主页面,首次进来的时候软键盘是被隐藏的,如果我从主页面进入 ActivityA ,在ActivityA 里面有输入框,我直接点击左上角的返回按钮回到主页面,软键盘并不会被隐藏,还是出现在页面中,
最终解决办法:
由于这个是主页面,我们想要每次进来的时候,软键盘都是被隐藏的,只需要把 stateHidden 换成 stateAlwaysHidden 或者直接删掉就好了。
你可以通过以下方式关注我: