最经一直在做电子书的项目,电子书使用的屏幕是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 条评论