AndroidのEditTextで入力制限をする

AndroidでEditTextの入力制限を実現しようとすると、パターン的には2つあって。

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がそれにあたります。

コメント