From the Southern Hemisphere

From the Southern Hemisphere

南半球に移住したプログラマの日々

【Android Studio】EditTextでEnterを押したらフォーカスが勝手に移動してしまう現象の対応

こんにちはピコピコくんです。
先日公開した県庁所在地クイズを開発しているときにEditText入力時の挙動でちょっと困ったことがあったので、今回はその現象と解決策をメモ。

現象

EditTextにソフトウェアキーボードで値を入力してEnterを押すと画面が下にずれて、キーボードが数字から文字の入力に変わる。

f:id:EstherSoftware:20190901193724j:plain
f:id:EstherSoftware:20190901193754j:plain

数字を入力して決定したら、何故か画面が下にスクロールして数字キーボードから文字を入力するキーボードに変わってしまう。しかも文字入力キーボードでEnterを押してもキーボードが消えずに残ったままになってしまう。うーんこれは困った。

考察1:フォーカスの移動を無効にしてみる

考察

EditTextに数字を入力した後に画面下部のAdViewにフォーカスが移っているように見える。ということはAdViewにフォーカスが移らないように設定すれば解決するのでは?

検証

AdViewにフォーカスが移らないようにレイアウトXMLに「android:focusable="false"」と「android:focusableInTouchMode="false"」を設定

<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
  android:focusable="false"
  android:focusableInTouchMode="false"
android:background="#000000"
app:adSize="BANNER"
app:adUnitId="ca-app-pub-XXXXXXXX/XXXXXXXX"></com.google.android.gms.ads.AdView>

結果

動作は最初と変わらず。画面が下にスクロールしてしまう。キーボードの動作もおかしいまま。どうやらこの方法では解決できないみたい。他の方法を考えてみよう...。

考察2:入力後に処理を終了させてみる

考察

それから少し考えて思いつきました。EditTextに数字を入力した後に入力処理を終了させればAdViewにフォーカスが移動しないのでは...?

検証

EditTextに「android:imeOptions="actionDone"」を設定して入力処理を終了させる。本来はコールバックメソッドを用意してアクション(この場合はDone)ごとに処理を記述するらしい。このコールバックメソッドを実装しないことで何も処理せず入力処理を終了させてみる。

<EditText
android:id="@+id/editText_QuestionCount"
android:layout_width="60dp"
android:layout_height="match_parent"
android:layout_marginLeft="25dp"
android:layout_marginTop="20dp"
android:ems="10"
android:inputType="number"
android:imeOptions="actionDone"
android:text="5"
android:textSize="18sp" />

結果

EditTextに数字を入力して決定するとソフトウェアキーボードが消えて、画面も下にスクロールせずに入力を完了できました。ひゃっほー!!

f:id:EstherSoftware:20190901200842j:plain
f:id:EstherSoftware:20190901200851j:plain

解決策

というわけでEditTextからAdViewへフォーカスが移動してしまう現象が起きた場合は、EditTextに「android:imeOptions="actionDone"」を追加すれば入力後にフォーカスが移動してしまうのを防ぐことができます。

読者さん募集中

記事が気に入ったら読者登録お願いします!