使用E-ink屏幕,基于android的设备,EditText不刷新的问题

最经一直在做电子书的项目,电子书使用的屏幕是E-ink电子屏,在使用的过程中发现了一个问题:当向EditText中输入字符时,EditText并不会立即刷新,但这一切在模拟器上是正常的,猜想肯定是和屏幕有关系,这关系应该提现在E-ink屏与LCD屏的不同吧,估计下层对这种屏幕的刷新方式做了特别的处理,可是我跟了下层的代码,目前也没有发下什么问题。目前只能从上层解决这个问题了。
由于我目前做的是输入法方面的东西,所以,这个EditText刷新的问题对我来说就是特别的重要了,否则我用输入法输了半天,却什么也没有显示,那岂不是非常悲剧。
对了,我可能没有把现象说的十分清楚。我再描述一下:

1)在模拟器上,当调出输入法时向EditText输入字符,下面是继承EditText重写了它的四个方法打出的log
Log:onStartBatchEdit();
onTextChanged();
onEndBatchEdit();
onDraw();
屏幕的刷新非常的正常。(要是模拟器上不正常就怪了,那样android可以去死了)
2)在硬件上,打出的log却是这样
Log:onStartBatchEdit();
onTextChanged();
onEndBatchEdit();

onFocusChanged();
onDraw();
输了半天字符,EditText框却没有半点变化。可是当焦点移开的时候,刚才输入的内容,却全部刷新出来了。
看见上面的Log了吗?在onEndBatchEdit()没有执行onDraw()。只有在onFocusChanged()后才执行了onDraw()。也就是说下层没有及时重绘该控件。可是还是没能找到更本原因。
还有一个现象是原本在模拟器上不停闪烁的光标,在硬件上也不再闪烁了。

总得有个解决办法吧,我想出了两个解决办法:
1)通过广播方式
当焦点在EditText上,当有按键时,且这一个按键可能引起EditView发生变化的时候,发送广播通知该EditText主动刷新一次,即在其receiver中执行 editText.postInvalidate(),问题解决。你可能会问,为什么不直接调用editText.postInvalidate(),而非要发广播?我前面说过了,我做的主要是输入法,输入法是一个service,它得不到EditText的对象。
2)通过继承EditText
继承之后,重写onEndBatchEdit()方法,在它里面执行editText.postInvalidate()。虽然在onTextChanged()中也可一解决输入刷新问题,但当操作是移动光标时,就依旧不能刷新了。因为移动光标不会执行onTextChanged()。

这样的话,这一问题就得到了暂时的解决。至于更本原因,哎,我尽力了,只能猜测是由于E-ink屏刷新特别的原因。

2012年11月29日更新

一直忘了记录,上面说的问题最后解决了。原因是由于修改了android源码,将Textview中刷新相关的代码做了优化。

0 条评论
发表一条评论

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。