前回は、XML のアトリビュートで、EditText の入力制限をする方法を探ってみた。今回は、XML のアトリビュートでは実現できなかった入力制限を、Java のコードで実現してみる。以下のコードでは、editText が、EditText のインスタンスだ。
行数を制限する
1行に制限する場合は、EditText のアトリビュートで android:singleLine を true に設定すればよいが、複数行許可したい場合は、自分でコードを書く必要がある。当然のことだが、複数行の入力を許可したい場合は、android:singleLine を false に設定しておかなければならない。
editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) { if (((EditText) v).getLineCount() >= <行数>) { return true; } } return false; } });
onKey(View, int, KeyEvent)を実装し、改行を行うキーコードが入力した場合の処理を記述すれば行数を制限できる。メソッドの戻り値は、true を戻したときに「メソッドがイベントを消費した」ことを意味するので、指定した行数以上の場合は true を戻して改行コードを無視するようにしている。
入力した文字を任意にチェックする
入力された文字のチェックは、いろいろなパターンが考えられるが、EditText がフォーカスを失ったときに保存するようにしていたので、ついでに入力チェックも行うようにしてみた。
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean flag) { if (!flag) { String s = editText.getText().toString().trim(); if (!s.matches("^[0-9]{4}$")) { editText.setText(<元の文字>); } else { // テキストの文字列を保存するなど } } } });
setOnFocusChangeListener(View.OnFocusChangeListener)メソッドで、フォーカスが変わったときのリスナーをセットして、onFocusChange メソッドの boolean の引数が false の時にチェックを行う。上記の例では、4桁の数字の場合はテキストの文字列を保存し、そうでない場合は元の文字列を設定するようにしている。
Android のウィジェットは、一通りのことができるように見えるのだが、実際にアプリケーションを作ってみるとかゆいところに手が届かない感じがする。作り始める前に、各種ウィジェットを継承したクラスを用意しておいた方が、手間が省けるかもしれない・・・