前回は、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 のウィジェットは、一通りのことができるように見えるのだが、実際にアプリケーションを作ってみるとかゆいところに手が届かない感じがする。作り始める前に、各種ウィジェットを継承したクラスを用意しておいた方が、手間が省けるかもしれない・・・