在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(安卓)TextView实现滚动跑马灯效果Marquee
  2. Android:layout_weight详解
  3. android:singleLine="true",[...]没有全部显示,只显示一个点[.]
  4. Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规
  5. android:paddingLeft与android:layout_marginLeft的区别
  6. Android布局中的常用属性小结
  7. android中怎么调整字体的间距和行间距
  8. 搭建Android(安卓)UI Testing自动化测试开发环境
  9. Android(安卓)imageView图片按比例缩放

随机推荐

  1. Android编码规范
  2. Android中的签名机制
  3. Android初步了解入门
  4. Android(安卓)View 相关源码分析之四 Lin
  5. TextView 属性
  6. Android(安卓)Tab 选项卡的简单实现
  7. Android的logcat用法
  8. Android系列教程之八:ListView组件的使用
  9. Android初步了解入门
  10. 20155323 第四次实验 Android程序设计实