はじめに
半年ほど前から、Chromebookの一部機種でAndroidサブシステムがAndroid 9ベースの物に入れ替わり始めました。この上で動作するAndroidアプリでEditTextの動作不良が出るようになりました。具体的には、マルチラインのEditTextでEnterキーを押した時に改行コードが入力されない、という問題です。Shift+Enterは何故か動きます。同じアプリを本物のAndroid+Bluetoothキーボードで動作させた場合は、問題なく動作します。しばらく原因不明で手が出せなかったのですが、ようやく原因が分かりました。
EditTextにEditorActionListenerを設定した場合に、actionId=actionNextでリスナが呼ばれることが分かりました。
edittext.setOnEditorActionListener { v, actionId, event ->
Log.d("====>","$actionId $event") // actionId=5が出力される
true
}
EditTextを特に普通にレイアウトやコードで作成した場合、imeOptionsにはactionUnspecified(=0)が設定されます。本物のAndroidだと、これが副作用を起こすことはなかったのですが、ChromebookではactionNextを指定した物として振る舞うようなのです。
このために、setOnEditorActionListenerのデフォルトの挙動(falseを返す)とした場合に、近隣のフォーカスを持つボタンがクリックされるという挙動を引き起こしていました。
ワークアラウンド
マルチラインのEditTextでEnterキーによる改行が必要な場合は、以下の設定を行います。
<EditText
...
android:imeOptions="actionNone"
/>
imeOptionsに明示的にactionNoneを指定することで、Enterキーは本来の挙動(改行する)として振る舞うようになります。
めでたしめでたし。って全然めでたくねーよ。
以上です。