1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Android: EditText で IME (ソフトウェアキーボード) の変換中・入力中の文字列を確定させる

Last updated at Posted at 2021-03-10

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() を呼び出しても、変換候補欄は表示されたままでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?