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)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2013 モバイル開発系(K) All rights reserved.
[Home]