EditTextでEnterキー押下時のイベントを処理するEditText(EclipseのGraphical LayoutだとPlain Text等)でEnterキーが押されたときに何か処理を行いたい場合がある。そのようなときはEditTextのsetOnEditorActionListenerメソッドでOnEditorActionListenerリスナを登録すれば良い。 OnEditorActionListenerはonEditorActionイベントをオーバライドすることで、Enterが押下されたときの処理を書くことができる。onEditorActionイベントの中では渡されたKeyEvent.getKeyCodeメソッドでキーコードを取得し、それがKeyEvent.KEYCODE_ENTERであれば必要な処理を行う。 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); editText1 = (EditText)findViewById(R.id.editText1); editText1.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // TODO Auto-generated method stub Log.d("onEditorAction", "actionId = " + actionId + " event = " + (event == null ? "null" : event)); if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) { if(event.getAction() == KeyEvent.ACTION_UP) { Log.d("onEditorAction", "check"); // ソフトキーボードを隠す ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0); Toast.makeText(getApplicationContext(), "editText1", Toast.LENGTH_SHORT).show(); } return true; } return false; } }); editText2 = (EditText)findViewById(R.id.editText2); editText2.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // TODO Auto-generated method stub Log.d("onEditorAction", "actionId = " + actionId + " event = " + (event == null ? "null" : event)); if(actionId == EditorInfo.IME_ACTION_DONE) { Log.d("onEditorAction", "check"); // ソフトキーボードを隠す ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0); Toast.makeText(getApplicationContext(), "editText2", Toast.LENGTH_SHORT).show(); return true; } return false; } }); } 尚、Enterキーが押下されるとonEditorActionイベントはDOWNとUPの2回発生するのでUPのときにのみ処理を行う。onEditorActionイベントの戻り値でtrueを返すとそのイベントを消費したことになるが、DOWNのとき(DONW→UPの順でイベント発生)にもtrueを返さないとEditTextが改行されてしまい、UPのイベントが発生しなかったのでそうしている。(もちろんDOWNのときに処理してしまっても良いだろう。) また、Enterが押下された後もソフトキーボードが表示されたままなので、同じイベントでInputMethodManager.hideSoftInputFromWindowメソッドを用いて隠している。 onEditorActionイベントの引数としてactionIdがあるが、これはソフトキーボードでEnterキーをどのように表示していたかを示すもので、特にオプションを指定していなければEditorInfo.IME_NULLになる。例えば、EditTextのプロパティでInput typeをtextUriに設定すると、ソフトウェアキーボードはURLの入力に便利なように変化し、actionIdはEditorInfo.IME_ACTION_DONE、event引数はnullとなる。 ただし、端末にキーボードをつないでEnterキーを押下した場合はこの限りではない。そうした場合にも対応するには、普通にキーコードを判定する処理も必要となる。 右はGalaxy SII LTEで上記のコードを実行したときの画像である。"/"キーが表示されていたり、Enterが"完了"になっていたりするのが確認できると思う。また、Input typeを設定することでEditText自体の振る舞いも変わる(例えば改行できなくなる等)ので、このプロパティを設定するときは注意が必要である。 うーん、いろいろと奥が深い。
(2012/02/25)
Copyright(C) 2004-2013 モバイル開発系(K) All rights reserved.
[Home]
|