複数あるEditTextの入力時のソフトキーボード制御
Androidにて同一のActivity内に複数のEditTextがあった場合、
ひとつのEditTextに入力をすると次のEditTextにフォーカスが移って連続して入力が始まる。
それを便利ととるかは人次第だけど、個人的にひとつ入力を終えた時点で
次の入力のためのソフトキーボードが立ち上がっていると画面の変化が見えなくてうっとおしい。
特にEditTextの入力によって動的な変化があった場合は尚更…
そこで最初はレイアウトのXML側でImeOptionsを設定して対処していた。
<EditText android:id="@+id/editText" android:layout_width="0dp" android:layout_height="wrap_content" android:inputText="number" android:imeOptions="actionDone" >
ただ、(特に数値)入力をした後に動的な変化がある場合、
EditTextが空なときなどに問題が発生することがある。
そのため、入力の完了時にEditTextが空の場合に指定の入力をセットするようにしたかった。
そこでキーリスナーを利用して対処しようとしたけど…
ImeOptionsにactionDoneを適用しているとOnKeyListenerのKeyEvent.KEYCODE_ENTERで拾ってもらえなくなる…
そこで泣く泣くImeOptionsを消して、他のEditTextをsetFocusableなどで誤魔化しつつ
EditText edit = (EditText)findViewById(R.id.editText); edit.setOnKeyListener(new OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //エンターが押されたとき(入力確定時) if(event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER){ //EditTextの中身が空だった場合に0を入れる if(edit.getText.toString().equals("")){ edit.setText("0"); edit.setSelection(edit.getText().toString.length()); } } //入力中に(ハードキーの)バックキーが押されたとき if(keyCode == KeyEvent.KEYCODE_BACK){ //EditTextの中身が空だった場合に0を入れる if(edit.getText.toString().equals("")){ edit.setText("0"); edit.setSelection(edit.getText().toString.length()); } } return false; } });
とりえずこれでなんとか入力問題はすっきりしたけど、結局ソフトキーボードが連続して立ち上がる問題が振り戻しに…
キーリスナーやらimeOptionsやら弄り回したけど両問題を一括して解決できない。
やっぱりACTION_DONEが使いたい…!
それをOnEditActionListenerが解決してくれた。
<EditText android:id="@+id/editText" android:layout_width="0dp" android:layout_height="wrap_content" android:inputText="number" android:imeOptions="actionDone" >
imeOptionsをactionDoneに戻して
EditText edit = (EditText)findViewById(R.id.editText); //アクションリスナー edit.setOnEditActionListener(new OnEditActionListener(){ @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { //ActionDoneの場合 if(actionId == EditorInfo.IME_ACTION_DONE){ //EditTextの中身が空だった場合に0を入れる if(edit.getText.toString().equals("")){ edit.setText("0"); edit.setSelection(edit.getText().toString.length()); } } return false; }); //キーリスナー edit.setOnKeyListener(new OnKeyListener(){ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { //入力中に(ハードキーの)バックキーが押されたとき if(keyCode == KeyEvent.KEYCODE_BACK){ //EditTextの中身が空だった場合に0を入れる if(edit.getText.toString().equals("")){ edit.setText("0"); edit.setSelection(edit.getText().toString.length()); } } return false; } });
アクションリスナーでActionDoneの場合の入力確定時操作を、キーリスナーでバックキー操作をフォローできるようになりました。
これで変にフォーカスで四苦八苦せずにソフトキーボードが鬱陶しくなく入力できるようになった。
にしてもはてなダイアリーのソース記載はインデントどうにかならないかな…