AndroidでEditTextの入力制限を実現しようとすると、パターン的には2つあって。
1つは、レイアウトファイルにinputType属性を設定する方法。
これは簡単な入力制限で、数字だけとかアルファベットだけとか、
そういった時に使います。
もう1つは、EditTextにInputFilterを設定する方法。
こっちはかなり複雑に入力制限ができます。
特定の文字を入力不可にしたり、入力した文字を強制的に変換したり。
特に必要となるのは、全角・半角変換のときでしょうか。
以下のコードは、全角で入力された数値を半角に変換するフィルター。
(※まともにコード表示ができないブログにガッカリだよ)
InputFilterSample
じつは、参考になるクラスが存在していて、android.text.InputFilter.AllCapsがそれにあたります。
1つは、レイアウトファイルにinputType属性を設定する方法。
これは簡単な入力制限で、数字だけとかアルファベットだけとか、
そういった時に使います。
もう1つは、EditTextにInputFilterを設定する方法。
こっちはかなり複雑に入力制限ができます。
特定の文字を入力不可にしたり、入力した文字を強制的に変換したり。
特に必要となるのは、全角・半角変換のときでしょうか。
以下のコードは、全角で入力された数値を半角に変換するフィルター。
(※まともにコード表示ができないブログにガッカリだよ)
public class SampleInputFilter implements InputFilter { @Override public CharSequence filter(final CharSequence source, final int start, final int end, final Spanned dest, final int dstart, final int dend) { int length = end; char c; StringBuffer sb = new StringBuffer(length); for (int i = 0; i < end; i++) { c = source.charAt(i); if (c >= '0' && c <= '9') { sb.append((char) (c - '0' + '0')); } else { sb.append(c); } } String s = sb.toString(); if (source instanceof Spanned) { SpannableString sp = new SpannableString(s); TextUtils.copySpansFrom((Spanned) source, start, length, null, sp, 0); return sp; } return s; } }このフィルターで重要なのは、最後のif文。 これは、sourceが入力確定状態かどうかをチェックし、確定状態じゃない場合はその状態のまま返し、確定している場合は単なる文字列として返しています。 ここをこうしておかないと、入力ボタンをタップするとすぐに文字が確定されてしまいます。 とまぁ、こんな感じで。変換処理の部分にいろいろ書き加えれば、 いろいろな変換や禁則文字を設定することができます。 とりあえず、簡単なプロジェクトですが添付しておきます。
InputFilterSample
じつは、参考になるクラスが存在していて、android.text.InputFilter.AllCapsがそれにあたります。
コメント
コメントを投稿