// //

複数ある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の場合の入力確定時操作を、キーリスナーでバックキー操作をフォローできるようになりました。
これで変にフォーカスで四苦八苦せずにソフトキーボードが鬱陶しくなく入力できるようになった。
にしてもはてなダイアリーのソース記載はインデントどうにかならないかな…