woshidan's blog

あいとゆうきとITと、とっておきの話。

EditTextにInputFilterをセットする

EditText から値を取得してバリデーション書くのつらくない? これはバリデーター的なクラス開発な機運と思って調べたら InputFilter なるものが見つかった。

バリデーションとは違って、入力値が追加されたときにその値を入力してよいかチェックして、 許可した入力値の場合だけその値を通すとか、英字を入力させたいとき、全部大文字に変換させるとか、そういったことができる。

ちょっと違った。

フォーカスしたときにデフォルトで表示されるキーボードの種類とあわせて利用したらよさそう、とは最初は思いましたが、正直一文字一文字チェックされた経験が無く、実際一文字ずつチェックされて表示されるのって割と鬱陶しいかもしれない、と思い直したりしてます。

電話番号とか値段入力とか、本当は半角数字しか受け付けたくないんだけど全角も入力されうるよね、というフォームについてたら親切かな、という所感です。

とりあえず、下記はお試しに書いた半角数字しか受け付けないフォームの実装例です。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = (EditText) findViewById(R.id.edit_text);

        InputFilter inputFilter = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {
                if (source.toString().matches("^[0-9]+$")) {
                    return source;
                } else {
                    return "";
                }
            }
        };

        // 配列をセットする
        editText.setFilters(new InputFilter[]{inputFilter});
    }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="Input Filter Sample" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/edit_text"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:inputType="number"
        />
</LinearLayout>

追伸

他のこと試そうと思ってandroid:inputType="number"そのままに関数書いてたら、この指定だけでも数字の入力しか受け付けなくなったので、 InputFilterを使うのって半角英数字のIDを適当に制限したいとか、文字数を一定制限したいとか、そう言う場合くらいなのかしら...。