最近遇到在一个项目中使用带输入框的自定义对话框时,在确认或取消对话框后,对话框消失了但输入法依旧显示,而在另外一个项目使用就正常的问题。经过排查发现是Manifest.xml配置问题。主要原因是下面这句配置
<activity android:name=".ui.XXXActivity"
android:windowSoftInputMode="stateHidden">
</activity>
既然找到原因那么解决办法就很多了。
1、去掉windowSoftInputMode这个配置
2、stateHidden改为stateAlwaysHidden
3、优化自定义对话框,在对话框消失时强制隐藏输入法
第3中方法只需要在自定义对话框中增加以下代码即可
@Override
public void dismiss() {
hideKeyboard();
super.dismiss();
}
public void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
下面我们再复习以下windowSoftInputMode这个属性,官网上是这么说的:
Activity 的主窗口与包含屏幕软键盘的窗口之间的交互方式。该属性的设置会影响两点内容:
当 Activity 成为用户注意的焦点时,软键盘的状态为隐藏还是可见。
对 Activity 主窗口所做的调整 — 是否将其尺寸调小,为软键盘腾出空间;或当软键盘遮盖部分窗口时,是否平移其内容以使当前焦点可见。
该设置必须是下表所列的其中一项值,或一个“state...”值加上一个“adjust...”值的组合。在任一组中设置多个值(例如,多个“state...”值)均会产生未定义的结果。各值之间使用竖线 (|) 进行分隔。
值 | 描述 |
---|---|
“stateUnspecified” | 不指定软键盘的状态(隐藏还是可见)。系统会选择合适的状态,或依赖主题中的设置。这是对软键盘行为的默认设置。 |
“stateUnchanged” | 当 Activity 转至前台时保留软键盘最后所处的任何状态,无论是可见还是隐藏。 |
“stateHidden” | 当用户选择 Activity 时(换言之,当用户确实是向前导航到 Activity,而不是因离开另一 Activity 而返回时)隐藏软键盘。 |
“stateAlwaysHidden” | 当 Activity 的主窗口有输入焦点时始终隐藏软键盘。 |
“stateVisible” | 在正常的适宜情况下(当用户向前导航到 Activity 的主窗口时)显示软键盘。 |
“stateAlwaysVisible” | 当用户选择 Activity 时(换言之,当用户确实是向前导航到 Activity,而不是因离开另一 Activity 而返回时)显示软键盘。 |
“adjustUnspecified” | 不指定 Activity 的主窗口是否通过调整尺寸为软键盘腾出空间,或者是否通过平移窗口内容以在屏幕上显示当前焦点。根据窗口的内容是否存在任何可滚动其内容的布局视图,系统会自动选择其中一种模式。如果存在这种视图,系统会调整窗口尺寸,前提是可通过滚动操作在较小区域内看到窗口的所有内容。这是对主窗口行为的默认设置。 |
“adjustResize” | 始终调整 Activity 主窗口的尺寸,以为屏幕上的软键盘腾出空间。 |
“adjustPan” | 不通过调整 Activity 主窗口的尺寸为软键盘腾出空间。相反,窗口的内容会自动平移,使键盘永远无法遮盖当前焦点,以便用户始终能看到自己输入的内容。这通常不如调整窗口尺寸可取,因为用户可能需关闭软键盘才能进入被遮盖的窗口部分,并与之进行交互。 |