3

リスト項目ビューに EditText ビューが組み込まれた ListView があります。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、携帯電話、タブレット) のいくつかの異なる IME でそれを見てきました。場合によっては、問題が数回繰り返され、自然に解決することがあります。それ以外の場合は、永久に継続します。

誰かがこれに対する回避策を持っていますか?

(私はこれを ListView や IME アーキテクチャのバグと考えていますが、どちらかを修正する以外の解決策を見つけなければならないことは明らかです。)

ソフト入力モードをadjustResizeからviewPanに切り替えてみましたが、別の(しかし同様の)問題が発生します。

(コレオグラファーが最初にビューをパンすると、ListView (および関連付けられた EditText) が少しだけ移動しますが、十分ではありません。これにより、EditText はフォーカスを失います (上記のメカニズムにより)。フォーカスが戻ったとき、コレオグラファーは再試行しません)。 IME の背後に隠れているだけです。このバグについては、他の SO 投稿で議論されているのを見たことがあります。)

4

1 に答える 1

0

インプット メソッドに関連するレイアウトの問題を処理する最良の方法はadjustResize、サブクラス化されたトップレベル ビューをカスタム実装した とともに使用することですfitSystemWindows(..)。サイズ変更やパンを既定のコードに依存する代わりに、 の実装は自分にとって意味のあることを実行してから、既定の処理を抑制するためにfitSystemWindows(..)戻ります。true

于 2015-09-12T20:52:05.460 に答える