在xml为EditText中设置imeOptions可以控制键盘确认键的具体功能,如下列举了一些

android:imeOptions="flagNoExtractUi" //使软键盘不全屏显示,只占用一部分屏幕 同时,这个属性还能控件软键盘右下角按键的显示内容,默认情况下为回车键android:imeOptions="actionNone" //输入框右侧不带任何提示android:imeOptions="actionGo"   //右下角按键内容为'开始'android:imeOptions="actionSearch" //右下角按键为放大镜图片,搜索android:imeOptions="actionSend"   //右下角按键内容为'发送'android:imeOptions="actionNext"  //右下角按键内容为'下一步' 或者下一项android:imeOptions="actionDone" //右下角按键内容为'完成'

坑1 若是多行显示,会使设置无效

若是设置了inputType="textMultiLine"会使android:imeOptions无效。
可以修改如下属性
xml中 属性设置:
1、 将singleLine设置为true(我没设置也行,但是最终的效果仍然是只能单行输入了)
2 、将inputType设置为text
相当于取消了多行显示的性质

java代码设置

editText.setInputType(EditorInfo.TYPE_CLASS_TEXT);editText.setImeOptions(EditorInfo.IME_ACTION_SEARCH);

坑2

问题描述:因为EditText一旦设置了多行显示,键盘总是显示Enter键。有时候我们不仅需要文本输入多行显示,而且Enter键需要支持imeOptions设置,比如显示完成键而不是回车换行。如这如何做呢?
问题分析以及解决:我们知道,当EditText弹出输入法时,会调用方法
public InputConnection onCreateInputConnection(EditorInfo outAttrs)
来创建和输入法的连接,设置输入法的状态,包括显示什么样的键盘布局。需要注意的地方是这部分代码:

if (isMultilineInputType(outAttrs.inputType)) {     // Multi-line text editors should always show an enter key.     outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_ENTER_ACTION; }private static boolean isMultilineInputType(int type) {        return (type & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE)) ==            (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE);    }

发现,当EditText的inputType包含textMultiLine标志位,会强迫imeOptions加上IME_FLAG_NO_ENTER_ACTION位,这导致了只显示Enter键。
解决方法:我们可以继承EditText类,覆写onCreateInputConnection方法,如下:

@Overridepublic InputConnection onCreateInputConnection(EditorInfo outAttrs) {        InputConnection inputConnection = super.onCreateInputConnection(outAttrs);        if(inputConnection != null){            outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;        }        return inputConnection;    }

以上参考的是:http://blog.sina.com.cn/s/blog_97eedec40100wwjd.html
我用的从stackflow抄的代码:
http://stackoverflow.com/questions/5014219/multiline-edittext-with-done-softinput-action-label-on-2-3

@Overridepublic InputConnection onCreateInputConnection(EditorInfo outAttrs) {    InputConnection connection = super.onCreateInputConnection(outAttrs);    int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;    if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {        // clear the existing action        outAttrs.imeOptions ^= imeActions;        // set the DONE action        outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;    }    if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;    }    return connection;}

然后这里还有一个坑,在基础EditText后,要重写完所有的构造函数,要不在inflate时会出错,直接调用父类的相关的构造方法就好。

更多相关文章

  1. Android查询:模拟键盘鼠标事件(adb shell 实现)
  2. android editText 软键盘enter键图标的设置
  3. 很实用的android按键处理
  4. Android平台开发-Android keypad map-Android按键识别及映射过程
  5. Android模拟、实现、触发系统按键事件的方法
  6. android 日期时间格式转换;软键盘显示消失;获取系统title
  7. Android按键消息传播流程
  8. 【按键】灭屏后瞬间按返回键,可以点亮屏幕
  9. Android软键盘手动显示、隐藏、布局上移和EditText上移

随机推荐

  1. Android 事件拦截/分发机制 (图解+代码)
  2. Android之android:launchMode
  3. 在Android里完美实现基站和WIFI定位
  4. Android 调用微信登陆、支付、分享,出现
  5. Android 分区挂载
  6. 130292015012 陈月凤 第一章作业
  7. 【Android】显示网络图片代码分析
  8. Android中Intent的使用示例
  9. Android 高级控件(二)
  10. Android 7.0 虚拟按键(NavigationBar)源码