Kotlin コードから、IME (ソフトウェアキーボード) の変換中・入力中の状態を確定させる。
コンテンツの送信ボタンを押したときなどに、IME を閉じるわけでもないけど IME を入力完了状態に確定させたいときに有効。
入力状態を確定させることで、以下のことが実現できる。
- EditText の入力中の表示(下線が引かれてハイライトされた状態)を解除できる
- IME の変換候補やサジェスト表示を閉じることができる
- IME のレイアウトにもよるが、変換候補をキーボードの上に表示するタイプのレイアウトなら IME の高さが変化し、小さくなる
実装
fun EditText.completeIme() {
val selection = selectionStart
// 変換中のハイライトは Spannable で表現されているため、
// toString() で Spannable を削除することでハイライトが消える
// setText() でテキストを設定しなおすことで、IME の変換中状態が解除される
setText(text.toString())
// setText() により、カーソルポジションが 0 に戻されてしまうので、
// 直前のカーソルポジションに復帰させる
setSelection(selection)
}
View.clearFocus() では IME は確定されない
View.clearFocus ではフォーカスが外れるだけで IME の入力中状態はそのままでした。
上記の実装ではフォーカスはそのままで IME の入力中状態だけが確定されます。
TextView.clearComposingText() も挙動が怪しい
TextView.clearComposingText も試してみましたが、正しく動作しませんでした。
Android 8 環境で ATOK や Gboard で入力中の状態としclearComposingText()
を呼び出すと、下線などは解除されましたが、さらに次の文字を入力すると確定したはずの文字が重複して入力されてしまう動きとなりました。
clearComposingText()
を呼び出しても、変換候補欄は表示されたままでした。