Android软键盘输入imeOptions
来源:互联网 发布:广州三箭汽枪淘宝网. 编辑:程序博客网 时间:2024/06/06 01:10
android:imeOptions
根据输入框输入完成后要执行的业务逻辑指定软键盘右下角Action按钮的样式和行为,如让右下角按钮显示为“搜索”,点击后执行搜索逻辑。
imeOptions 有下面一些值:
IME_ACTION_UNSPECIFIED. 编辑器决定Action按钮的行为
IME_ACTION_GO Action按钮将作为 “开始” 按钮。点击后跳转到输入字符的意图页面
IME_ACTION_SEARCH 执行“搜索”按钮。点击后跳转到输入字符的搜索结果页面
IME_ACTION_SEND. 执行 “发送”按钮。点击后将输入字符发送给它的目标
IME_ACTION_NEXT. Action按钮将作为next(下一个)按钮。点击后将进行下一个输入框的输入
IME_ACTION_DONE. Action按钮将作为done(完成)按钮。点击后IME输入法将会关闭
IME_ACTION_PREVIOUS. 作为”上一个”按钮。点击后将进行上一个输入框的输入
IME_FLAG_NO_FULLSCREEN. 请求IME输入法永远不要进入全屏模式
IME_FLAG_NAVIGATE_PREVIOUS. 类似IME_FLAG_NAVIGATE_NEXT, 表明这里有后退导航可以关注的兴趣点
IME_FLAG_NAVIGATE_NEXT. 表明这里有前进导航可以关注的兴趣点,类似IME_ACTION_NEXT,不过允许IME输入多行且提供前进导航。
IME_FLAG_NO_EXTRACT_UI. 请求IME输入法不要显示额外的文本UI
IME_FLAG_NO_ACCESSORY_ACTION. 和一个Action结合使用表明在全屏输入法中不作为可访问性按钮
IME_FLAG_NO_ENTER_ACTION. 多行文本将自动设置了该标志位,执行Action时为换行效果,如果未设置,IME输入法将把Enter按钮自动替换为Action按钮
IME_FLAG_FORCE_ASCII. 请求IME输入法接受ASCII字符的输
注意
这里大部分ImeOptions的值都比较好理解,有下面几个值需要注意:
通过一些bug案例来说明
IME_FLAG_NO_EXTRACT_UI
【bug】当时做一款输入法,从自定义假框切换回真框时,需要把自定义InputConnection切换回系统的InputConnection,这时需要恢复系统的imeOption,只恢复了低8位Action值,导致一些手机横屏后,弹出的软键盘没有候选栏,中文输入法无法使用。
原因:imeOption丢失高位上的值,UI相关信息丢失,InputMethodService中代码如下
/** * Return whether the fullscreen extract view is shown. This will only * return true if {@link #isFullscreenMode()} returns true, and in that * case its value depends on the last call to * {@link #setExtractViewShown(boolean)}. This effectively lets you * determine if the application window is entirely covered (when this * returns true) or if some part of it may be shown (if this returns * false, though if {@link #isFullscreenMode()} returns true in that case * then it is probably only a sliver of the application). */ public boolean isExtractViewShown() { return mIsFullscreen && !mExtractViewHidden; } void updateExtractFrameVisibility() { final int vis; if (isFullscreenMode()) { vis = mExtractViewHidden ? View.INVISIBLE : View.VISIBLE; // "vis" should be applied for the extract frame as well in the fullscreen mode. mExtractFrame.setVisibility(vis); } else { vis = View.VISIBLE; mExtractFrame.setVisibility(View.GONE); } // ... }
意思是,当全屏模式下有IME_FLAG_NO_EXTRACT_UI时,即mExtractViewHidden= true是cand候选栏的父Layout为INVISIBLE,
解决:
可以在判断全屏模式时加一个变量控制
isNoExtractUI = (option & EditorInfo.IME_FLAG_NO_EXTRACT_UI) == EditorInfo.IME_FLAG_NO_EXTRACT_UI;
@Override public final boolean onEvaluateFullscreenMode() { return (super.onEvaluateFullscreenMode() && (!isNoExtractUI)); }
IME_FLAG_NO_ENTER_ACTION
【bug】 在备忘录输入文字后,按回车键,这时需要换行,但是输入法没有换行,而是收起输入键盘。
原因:
EditText/TextView输入框默认是可以多行显示的,此时的右下角Action按钮只会作为换行按钮,无论你的imeOptions指定的是什么。
原因是系统在onCreateInputConnection中设置了,代码如下:
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键。
上面描述的与我出现bug正好相反,因为我对Action操作进行拦截了,定义了一些列的操作,当imeOptions有IME_FLAG_NO_ENTER_ACTION,应该执行回车操作,而实际执行了
提交操作performEditorAction,收起输入面板
修改:
// 多行文本换行问题 boolean isNoEnter = (action & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == EditorInfo.IME_FLAG_NO_ENTER_ACTION;
加一个isNoEnter变量,当isNoEnter = true时,不执行提交操作。
IME_FLAG_NAVIGATE_NEXT
【bug】在小米视频APP中,搜索框输入文本点击回车键,Action状态从“搜索”变成“回车”,却没有执行搜索功能,并且搜索框失去焦点
原因:
imeOption值中包含了IME_FLAG_NAVIGATE_NEXT,表明这里有前进导航可以关注的兴趣点,代码逻辑在TextView.onCreateInputConnection
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { if (focusSearch(FOCUS_DOWN) != null) { outAttrs.imeOptions |= EditorInfo.IME_FLAG_NAVIGATE_NEXT; } if (focusSearch(FOCUS_UP) != null) { outAttrs.imeOptions |= EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS; } }
这里先获取当前焦点控件,然后根据direction获取下一个最佳的控件,获取控件后调用他的requestFocus,并给前面的焦点控件一个机会处理失去焦点事件,看一下focusSearch
public View focusSearch(@FocusRealDirection int direction) { if (mParent != null) { return mParent.focusSearch(this, direction); } else { return null; } }
焦点丢失,搜索没有执行搜索,且搜索框失去焦点。
修改:
action = imeOption & EditorInfo.IME_MASK_ACTION
对imeOption取低8位执行搜索操作
- Android软键盘输入imeOptions
- android:imeOptions 控制软键盘右下角按键
- Android 软键盘事件imeOptions响应
- Android 软键盘事件imeOptions响应
- Android 软键盘事件imeOptions响应
- android 软键盘Enter键图标的设置 android:imeOptions
- android 软键盘Enter键图标的设置 android:imeOptions
- Android 软键盘imeOptions(Done)的用法
- edittext的imeOptions属性和android软键盘的使用
- 软键盘的显示问题 imeOptions
- android软键盘的事件响应:android EditText inputType 及 android:imeOptions=”actionDone”
- 1EditText初始不弹出软键盘,只有光标显示,点击再弹出;2android:imeOptions
- Android如何将软键盘回车换成搜索等按钮,EditText中imeOptions属性的使用
- 记一次,软键盘设置android:imeOptions="actionDone"在华为手机上无效的坑
- android软键盘输入,windowSoftInputMode
- android监听软键盘输入@
- Android软键盘输入详解
- 股票输入软键盘,android初探自定义软键盘
- Spring IOC 和 AOP
- 两年小前端裸辞求职经历
- ssh框架java.lang.IllegalArgumentException
- Java中的ReadWriteLock是什么?
- MySQL 5.7.18的安装及主从复制(主从同步)
- Android软键盘输入imeOptions
- 同时启动多个tomcat 端口配置
- (详细)Hibernate查询技术(Query、Session、Criteria),Hibernate的三种状态,Hibernate集合struts2实现登录功能(二)
- 如果同步块内的线程抛出异常会发生什么?
- ECHO命令详解
- 查找算法:顺序查找、二分查找、分块查找
- 蓝桥杯 出现次数最多的整数
- C#学习 SortedList
- JavaScript 函数