【发布时间】:2013-09-06 00:02:44
【问题描述】:
我有一个 ListView,其中 EditText 视图合并到列表项视图中。当 IME 弹出时,它会导致 ListView 调整大小(调用 layout())。在 ListView.layout() 函数运行过程中,它会暂时将焦点从选中的 EditText 上移开,然后将焦点恢复到之前选中的 EditText。
这没问题,但是当我使用包含预测文本组件的 IME 时,IME 将再次更改大小(为预测文本栏增加空间)。这会导致 EditText 散焦...这似乎会导致 IME 关闭预测文本栏...这会导致布局再次重复。一旦布局完成并且 EditText 再次获得焦点,IME 会看到活动文本并重新断言预测文本栏,导致它再次调整大小,导致 ListView 进行另一次布局传递,导致 EditText 再次失去焦点,导致IME 关闭其预测文本栏并调整大小,无限。
这有一个计时组件,它取决于我使用的 IME,但我已经在几代不同的设备(2.2、2.3、4.0、4.1、电话和片剂)。有时问题会循环几次并自行解决。其他时候它将永远持续下去。
有人能解决这个问题吗?
(我认为它是 ListView 和/或 IME 架构中的错误,但我显然必须找到解决方案,而不是修复其中任何一个。)
我尝试将我的软输入模式从 adjustResize 切换到 viewPan,但这遇到了一个不同(但相似)的问题。
(当编舞者第一次平移视图时,它会稍微移动 ListView(和关联的 EditText)但还不够。这会导致 EditText 失去焦点(通过上述机制)。当它重新获得焦点时,编舞者不会重新- 尝试将其显示 - 它只是将其隐藏在 IME 后面。我在其他 SO 帖子中看到过这个错误。)
【问题讨论】:
标签: android listview android-edittext race-condition ime