3

我有一个 ListView,其中 EditText 视图合并到列表项视图中。当 IME 弹出时,它会导致 ListView 调整大小(调用 layout())。在 ListView.layout() 函数运行过程中,它会暂时从选定的 EditText 中移除焦点,然后将焦点恢复到之前选定的 EditText。

这没关系,但是当我使用包含预测文本组件的 IME 时,IME 将再次更改大小(为预测文本栏增加空间)。这会导致 EditText 散焦...这似乎会导致 IME 关闭预测文本栏...这会导致布局再次重复。一旦布局完成并且 EditText 再次获得焦点,IME 会看到活动文本并重新断言预测文本栏,导致它再次调整大小,导致 ListView 进行另一次布局传递,导致 EditText 再次失去焦点,导致输入法关闭其预测文本栏并调整大小,无限广告。

这有一个计时组件,它取决于我使用的 IME,但我已经在几代不同的设备(2.2、2.3、4.0、4.1、手机和平板电脑)上看到了几种不同的 IME。有时问题会循环几次并自行解决。其他时候它将永远持续下去。

有没有人可以解决这个问题?

(我认为它是 ListView 和/或 IME 架构中的一个错误,但我显然必须找到解决方案,而不是修复其中任何一个。)

我尝试将我的软输入模式从 adjustResize 切换到 viewPan,但这遇到了一个不同(但相似)的问题。

(当编舞者第一次平移视图时,它会稍微移动 ListView(和相关的 EditText),但还不够。这会导致 EditText 失去焦点(通过上述机制)。当它重新获得焦点时,编舞者不会重新尝试把它带入视野——它只是把它隐藏在 IME 后面。我在其他 SO 帖子中看到过这个错误。)

4

1 回答 1

0

到目前为止,处理涉及输入法的布局问题的最佳方法是adjustResize与具有自定义实现的子类顶级视图一起使用fitSystemWindows(..)。无需依赖任何默认代码来调整大小或平移,您的实现fitSystemWindows(..)可以做任何对您有意义的事情,然后返回true以抑制默认处理。

于 2015-09-12T20:52:05.460 回答