在开发中,经常会碰到一个界面上显示多个输入框的需求,而且输入的时候,输入法还要弹出自己的面板,因此极有可能出现输入法遮挡输入框的问题。
这种情况下,用户往往需要先点输入框,弹出输入法,输入信息;然后收起输入法,点下一个输入框,弹出输入法,输入信息;然后重复操作,直到所有输入框都操作一次,而且因为输入法的弹出,整个界面将被向上顶出屏幕,这样就会给用户造成很糟糕的体验。就像下面这样子:
那么这个问题该如何解决呢?大致有下面几个方法:
1、使 ScrollView 布局
这个方法很简单,就是给上面这群 EditText 外部套一层 ScrollView,当输入发弹起来之后,布局可以上下滚动,此时输入法也不会收起来,点击各 EditText 时,输入法会实时切换输入方式,而且此时界面顶部不会被顶出屏幕。代码很简单,就不贴出来了,效果如下:
2、设置 windowSoftInputMode 属性
windowSoftInputMode 属性是在Manifest中设置给Activity节点的属性,如果这个Activity上存在输入框,那么在运行过程中,将会根据它的取值,去决定软键盘的监护方式。
它共有9种状态,而且这9种值可以进行随意组合,官方给的9种状态的解释大概如下:
- stateUnspecified:软键盘状态未指定,系统将自动选择合适的状态或依赖于主题的设置
- stateUnchanged:软键盘将一直保持在上一个Activity里的状态,无论是隐藏还是显示
- stateHidden:用户选择Activity时,软键盘总是被隐藏
- stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
- stateVisible:软键盘通常是可见的,可以将软键盘召唤出来,即使在界面上没有输入框的情况下也可以强制召唤出来。
- stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
- adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
- adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
- adjustPan:系统会通过布局的移动,来保证有焦点的输入框肯定能显示出来,从而让用户可以看到自己输入的内容。对于没有滚动控件的布局来说,这个其实就是默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。但是对于有滚动控件的布局来说,则不太一样。
使用方法如下:
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize">
······
</activity>
PS:这里个人偏好 adjustResize,因为它不会导致布局整个被顶出去,而且能把底部对齐的控件顶上来显示在键盘之上,如下图:
更多对比细节可参考:https://blog.csdn.net/vv_bug/article/details/52389846
3、设置 imeOptions 属性
可能已经有人发现了上面几个效果图中,百度输入法右下角有个蓝色的按钮,“下一项”就能将输入焦点移到下一个输入框,“完成”就能收起输入法。这两个动作都是通过 imeOptions 的值实现的,但是不同的输入法,对应的显示效果可能不同,有的可能显示为文字,有的则可能显示为图标。而且显示效果是输入法决定的,我们无法干预,但我们能通过 imeOptions 控制这个按钮的动作。
PS,android:imeActionLabel这个不是用来给我们自定义右下角这个enter button的文字用的,用它设置的文字的用途是:
The full label is only displayed when the IME has a large amount of space for it (such as when the standard keyboard is in fullscreen mode).
imeOptions 的取值可以使如下这些:
actionDone,完成,对应 EditorInfo.IME_ACTION_DONE
actionGo,前进,对应 EditorInfo.IME_ACTION_GO
actionNext,下一项,对应 EditorInfo.IME_ACTION_NEXT
actionNone,无动作,对应 EditorInfo.IME_ACTION_NONE
actionPrevious,上一项,对应 EditorInfo.IME_ACTION_PREVIOUS
actionSearch,搜索,对应 EditorInfo.IME_ACTION_SEARCH
actionSend,发送,对应 EditorInfo.IME_ACTION_SEND
actionUnspecified,未指定,对应 EditorInfo.IME_ACTION_UNSPECIFIED
flagForceAscii,
flagNavigateNext,
flagNavigatePrevious,
flagNoAccessoryAction,
flagNoEnterAction,
flagNoExtractUi,
flagNoFullscreen,
flagNoPersonalizedLearning,
normal
在本文的例子中,默认存在 actionNext、actionDone 值,因此会显示“下一项”、“完成”,我们便可以通过这个按钮进行输入过程的导航。其中 actionPrevious、actionNext 会自动处理,而其它几个 action 的属性需要开发者设置监听,然后进行相应事件的响应。action 监听响应的设置方法如下:
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (EditorInfo.IME_ACTION_DONE == actionId) {
// 执行 done 操作
return true;
}
return false;
}
});
此文同步发布于本人微信公众号:灰灰的Rom笔记