如何解决输入法遮挡输入框导致操作不便的问题?

在开发中,经常会碰到一个界面上显示多个输入框的需求,而且输入的时候,输入法还要弹出自己的面板,因此极有可能出现输入法遮挡输入框的问题。

这种情况下,用户往往需要先点输入框,弹出输入法,输入信息;然后收起输入法,点下一个输入框,弹出输入法,输入信息;然后重复操作,直到所有输入框都操作一次,而且因为输入法的弹出,整个界面将被向上顶出屏幕,这样就会给用户造成很糟糕的体验。就像下面这样子:

那么这个问题该如何解决呢?大致有下面几个方法:

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笔记
微信扫码关注

猜你喜欢

转载自blog.csdn.net/shawnxiafei/article/details/80399731