现在的位置: 首页 > 综合 > 正文

Android 输入法存在情况下Enter键无效

2014年10月11日 ⁄ 综合 ⁄ 共 1160字 ⁄ 字号 评论关闭

http://blog.sina.com.cn/s/blog_6e15a6010100m5vk.html


这个问题断断续续折腾了将近一个月才找到问题的根源。希望能对出现类似问题的人有帮助。

问题描述:
      公司做了一个应用程序,发现在中文输入法的情况下,某些时候点击回车键无效,但是在英文输入法的情况下,回车键始终是有效的。
 
背景知识:
      Android的事件处理与分发流程中,如果发现当前View窗口的输入法可用,就将事件发送给输入法,由输入法接管处理。输入法处理完成后会将结果发送给焦点View。焦点View再接着处理输入法过滤后的事件。如果输入法不可用,则将事件一层一层的向下传递。
 
排除问题步骤:
1、首先找到为什么英文输入法没问题,但是中文输入法有问题,我们调查发现,英文输入法对Enter键没有特殊的处理,在收到Enter消息时,不做特殊处理,又将消息按原路径向下层传递。而中文输入法对Enter键进行了特殊处理,它走的路径已经与英文输入法不同。
2、找到Enter键不可用的直接原因,我们发现,在输入法中保持了当前焦点View的引用,Framework在处理时,会取得焦点View的AttachInfo信息中的Handler,如果Handler不为null则将Enter事件发给Handler,如果为null,则什么也不处理。在Enter键无法响应时,我们发现此时的Handler为null。
3、我们在寻找Handler为null的原因时,花费了大量的精力,另外更进一步发现有些时候输入法中保存的当前焦点View,并不为现在程序中焦点所在的View。
4、我们估计出现Enter键无效的原因,是因为输入法中保存的焦点View信息不正确,为什么保存的焦点View不正确?难道是Framework有问题吗?
5、经历若干的痛苦之后我们大胆推测造成Enter键无效的原因是应用造成的,于是我开始阅读应用的代码,并且顺便阅读了输入法中焦点View如何保存的代码。终于可以肯定是应用的设计架构有问题!!
 
根本解释:
应用在实现时,对于它在界面上显示的View进行了动态的增减,于是Framework通过自己机制找到的焦点View不正确了,因为应用进行动态增减,造成Framework自己找到的焦点View可能被应用删除,Framework找焦点View时,应用真正的焦点View还没有生成。而且应用也确实是自己在控制焦点等信息,焦点等的事件并没有交给Framework来处理。
 
解决方案:
最好的解决方案是重新设计应用的实现,但由于工期等原因,可能并不可行。我们给出了两个回避策
1、如果应用界面不需要输入法,则在应用的Activity启动时,屏蔽掉输入法,始终走原来的路径传递。
2、既然应用是自己来控制焦点,那么他们在控制焦点得到

抱歉!评论已关闭.