Android 进入Activity主动弹出软键盘输入法及stateVisible和stateAlwaysVisible的区别

在App开发中有些页面的功能定位就是搜索,用户进入该页面的唯一仅有的目的就是搜索,比如淘宝点击搜索框跳转的搜索商品页面,对于这种页面最好的设计就是一进入就把焦点定位在输入框,且弹出输入法,用户一进入进可以直接在软键盘上输入,而不必要再点一下输入框再弹出输入法。虽然是一个很细节的东西,但却是很好的用户体验。

废话这么多,该上代码了

1
2
3
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateVisible"/>

Click and drag to move

还有另一个属性stateAlwaysVisible也可以实现同样的功能。

1
2
3
<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateAlwaysVisible"/>

Click and drag to move

stateVisible和stateAlwaysVisible的区别

既然stateVisible和stateAlwaysVisible都可以实现一进入Activity就弹出软键盘的功能,那么这两者又有什么区别呢?我们先看下谷歌官网的说明:

stateVisible The soft keyboard is visible when that’s normally appropriate (when the user is navigating forward to the activity’s main window).
stateAlwaysVisible The soft keyboard is made visible when the user chooses the activity — that is, when the user affirmatively navigates forward to the activity, rather than backs into it because of leaving another activity.

但是我个人觉得官网的解释有误(如果我的英语理解能力没错的话),对于stateAlwaysVisible,官网的说明是说从其他地方进入Activity的话,会弹出软件盘,如果是从其他页面返回的话是不会弹出的。

单我的理解是设置成stateAlwaysVisible的话,不管是往前进入,还是从其他页面返回,总是会弹出软键盘。

为了验证我的想法,我写了两个Activity验证下

MainActivity中有一个Edittext和一个Button,点击Button跳转到SecondActivity

首先先设置MainActibity的android:windowSoftInputMode=”stateVisible”,首先进入MainActivity,软键盘自动弹出,然后收起软键盘,点击Button跳转SecondActivity后再返回MainActivity,发现软键盘不弹出了。但是如果我们收起软键盘后不是进入SecondActivity再返回,而是按Home键返回左面再重新进入MainActivity,会发现输入法会重新弹出。

接下来设置MainActibity的android:windowSoftInputMode=”stateAlwaysVisible”,首先进入MainActivity,软键盘自动弹出,然后收起软键盘,点击Button跳转SecondActivity后再返回MainActivity,发现已经收起的软键盘会再次弹出来。这也验证了我的想法,说明官网的描述有误。

总结

stateVisible:从其他页面或桌面往前进入该Activity,会弹出软件盘,如果是从其他页面返回该Activity,则已收起的软键盘不会再弹出。

stateAlwaysVisible:不管是从从其他页面或桌面往前进入该Activity,还是从其他页面返回该Activity,已收起的软键盘都会再弹出。

在代码中设置softInputMode

当然,我们也可以在Activity的onCreate中设置softInputMode,如下代码所示,和在Manifest中设置是等价的

1
2
3
4
// 等价于android:windowSoftInputMode="stateVisible"
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
// 等价于android:windowSoftInputMode="stateAlwaysVisible"
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Click and drag to move