InputFilter: その概要、InputFilterインターフェースとAndroidでのフィルタリング

著者: IT Sectr 公開日: 2026-07-08 読了時間: 5 分

InputFilterはAndroid SDKのインターフェースで、EditTextに表示される前に入力テキストをインターセプトして変更することを可能にします。開発者はフィルタリングルール(許可文字、最大長、入力形式)を設定します。Android Developers、2026年によると、InputFilterは文字、数字、特殊文字の入力を制限し、テキストを自動的にフォーマットするために使用されます。TextWatcherとは異なり、フィルタはテキスト変更前に作動するため、ソースレベルで不正な入力を防ぎます。

重要なポイント

  • InputFilterはEditTextとTextViewでの入力を制限およびフォーマットするAndroidインターフェースです。
  • フィルタメソッドはテキスト変更前に呼び出され、変更が許可されている場合はフィルタリングされたCharSequenceまたはnullを返します。
  • InputFilter.LengthFilterは最大テキスト長を制限する標準実装です。
  • カスタムフィルタは特定の文字を禁止したり、入力マスクを適用したり、英字の大文字小文字を変換したりできます。
  • フィルタチェーン — 1つのEditTextに複数のInputFilterを同時に適用でき、順次実行されます。

InputFilterとは何か、なぜ必要なのか

InputFilterはandroid.textパッケージの関数型インターフェースで、単一のメソッドfilter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)を定義します。ユーザーがEditTextでテキストの入力、貼り付け、置換を試みるたびに自動的に呼び出されます。戻り値は、変更が受け入れられるか、拒否されるか、変更されるかを決定します。

InputFilterの主な目的は、テキストがフィールドに入る前に不正な入力を防止することです。たとえば、電話番号の数字入力フィールドでは、フィルタが文字や特殊文字をブロックできます。パスワードフィールドでは、最小長を強制できます。確認コードフィールドでは、数字のみを許可できます。TextWatcherによる検証とは異なり、フィルタは誤った文字が画面に表示されること自体を防ぎます。

Android Developersによると、InputFilterはTextInputEditTextのすべてのMaterial Designコンポーネントで使用されています。PhoneNumberFormattingTextWatcherのようなライブラリは、完全なフォーマットのためにTextWatcherとInputFilterを組み合わせています。不正入力に対する防御の第一線としてInputFilterを使用し、入力後の追加ロジックにはTextWatcherを使用することをお勧めします。

InputFilterの仕組み

フィルタメソッドは6つのパラメータを受け取ります。source — 入力テキスト、startとend — 入力フラグメントの境界、dest — フィールドの現在の内容、dstartとdend — 挿入位置です。メソッドがnullを返す場合、変更はそのまま受け入れられます。空の文字列“”を返す場合、変更はブロックされます。新しいCharSequenceを返す場合、元のテキストは返された値に置き換えられます。

たとえば、ユーザーが数字のみを許可するフィールドに文字“a”を入力しようとすると、フィルタは“”を返し、文字は表示されません。“123”が入力された場合、フィルタは区切り文字を追加して“1-2-3”を返すことができます。このメカニズムにより、TextWatcherなしで電話番号、日付、その他の構造化データの自動フォーマットが可能になります。

重要:InputFilterは元のデータソースを変更しません。フィルタリングされたバージョンを返すだけです。Android自体が返された値をEditableに適用します。フィルタがnullを返す場合、追加のアクションは必要ありません。変更されたテキストを返す場合、Androidは元の範囲を削除して新しいものを挿入します。

Android SDKの標準フィルタ

Android SDKはInputFilterのいくつかの組み込み実装を提供しています。最も一般的なのはInputFilter.LengthFilterで、最大テキスト長を制限します。コンストラクタは整数(最大文字数)を受け入れます。現在のテキスト長と入力が制限を超えると、フィルタは切り詰められた文字列を返し、制限超過を防ぎます。

InputFilter.AllCapsも利用可能で、すべての入力文字を大文字に変換します。コード、郵便番号、その他大文字小文字が重要なデータのフィールドで使用されます。フィルタは単に小文字をブロックするのではなく変換するため、ユーザーにとって便利です — 変換結果が表示されます。

複数制限のためのInputFilter.LengthFilter — フィルタの組み合わせにより実現します。たとえば、長さを20文字に制限し数字のみを許可する場合、LengthFilter + カスタム数字フィルタを適用できます。各フィルタは順次実行され、前のフィルタの結果が次のフィルタのdestになります。

フィルタ目的使用例
LengthFilterテキスト長の制限名前フィールド(最大50文字)
AllCaps大文字変換郵便番号フィールド
カスタムInputFilter任意のフィルタリングルール数字のみ、特殊文字禁止

カスタムInputFilterの作成

カスタムフィルタを作成するには、InputFilterインターフェースを実装し、filterメソッドをオーバーライドします。よくあるタスクは、数字のみを許可するフィルタです。この場合、メソッドはCharacter.isDigitを使用してsourceの各文字をチェックし、すべての文字が有効な場合はフィルタリングされた文字列またはnullを返します。

kotlin
class DigitsInputFilter : InputFilter {
    override fun filter(
        source: CharSequence?,
        start: Int,
        end: Int,
        dest: Spanned?,
        dstart: Int,
        dend: Int
    ): CharSequence? {
        val sb = StringBuilder()
        for (i in start until end) {
            val c = source?.get(i)
            if (c != null && Character.isDigit(c)) {
                sb.append(c)
            }
        }
        return if (sb.length == end - start) null else sb
    }
}

例としてDigitsInputFilterは、入力テキストのすべての文字を反復処理し、数字のみを保持します。すべての文字がチェックに合格した場合、メソッドはnullを返します — これが最適なケースで、追加のメモリ操作は不要です。一部の文字が破棄された場合、新しい文字列が返され、EditTextには数字のみが到達します。

もう1つの一般的なシナリオは、特殊文字をブロックするフィルタです。実装は同様で、Character.isLetterOrDigitによる各文字のチェック、または許可文字リストとの比較を行います。このようなフィルタは、ユーザー名フィールド、検索文字列、その他特殊文字が許可されていない場所で使用されます。

EditTextへのInputFilterの適用

フィルタはsetFilters(InputFilter[])メソッドを介してEditTextに設定されます。フィルタ配列は現在のフィルタを置き換えるため、既存のフィルタに追加する場合は、getFilters()で現在のフィルタを取得し、新しい配列を作成して再度設定する必要があります。EditTextにはデフォルトのフィルタ(LengthFilter)が1つあり、これはXMLのandroid:maxLengthで設定されます。

kotlin
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
    DigitsInputFilter(),
    InputFilter.LengthFilter(10)
)

この例では、DigitsInputFilter(数字のみ)とLengthFilter(最大10文字)の2つのフィルタが設定されています。配列内のフィルタの順序は重要です。最初のフィルタが元の入力を受け取り、処理して結果を2番目に渡します。DigitsInputFilterが一部の文字をフィルタリングした場合、LengthFilterは既にフィルタリングされたテキストを参照し、それに長さ制限を適用します。

フィルタはXML属性android:inputTypeを介して設定することもでき、一部のフィルタが自動的に追加されます。たとえば、inputType=“phone”はDigitsKeyListenerを追加し、数字と一部の特殊文字のみを許可します。ただし、フィルタリングを完全に制御するには、特に複数のルールを組み合わせる場合は、プログラムでsetFiltersを使用することをお勧めします。

InputFilterと入力検証

InputFilterとTextWatcherは異なる機能を実行し、しばしば一緒に使用されます。InputFilterは入力レベルで動作し — 不正な文字がフィールドに入るのを防ぎます。TextWatcherは入力後に動作し — 変更に反応し、複雑な検証ルールを実行し、UIを更新できます。両方のアプローチの組み合わせが最良の結果をもたらします。

たとえば、メール入力フィールドの場合:InputFilterは入力レベルでスペースやキリル文字をブロックでき、TextWatcherは各変更後に完全なメールパターン準拠をチェックできます。前者は明らかなエラーから保護し、後者は構造的エラーから保護します。この責任の分離によりコードがよりクリーンになり、検証の負荷が軽減されます。

Material Design Guidelinesによると、フィルタは厳格な制約があるフィールド(電話番号、確認コード、PINコード、郵便番号)に適用する必要があります。緩やかな検証のフィールド(名前、住所、コメント)では、ユーザーが正当だが非標準的な値を入力するのを妨げないよう、TextWatcherのみで十分です。

基準InputFilterTextWatcher
作動タイミングテキスト変更前テキスト変更後
目的無効な文字のブロック変更への反応、検証、UI
戻り値フィルタリングされたテキストまたはnullなし(void)
適用setFilters()addTextChangedListener()

よくある質問

InputFilterとTextWatcherの違いは何ですか?

InputFilterはテキスト変更前に入力をインターセプトし、ブロックまたは変更できます。TextWatcherは変更後に呼び出され、新しい値に反応できます。InputFilterは予防的保護、TextWatcherは後処理です。完全なフォーム検証には、両方のアプローチを使用することをお勧めします。

EditTextに複数のフィルタを適用するには?

フィルタの配列をsetFilters()メソッドに渡します。フィルタは配列の順に順次実行されます。既存のフィルタを失わないようにするには、getFilters()で取得し、配列のコピーに新しいものを追加して、setFiltersで再設定します。既にインストールされているフィルタを考慮せずに上書きしないでください。

InputFilterをテキストフォーマットに使用できますか?

はい、InputFilterは変更されたCharSequenceを返すことで入力を変更できます。たとえば、電話番号フィルタはスペースや括弧を追加できます。ただし、複雑なフォーマットには、InputFilterをTextWatcherと組み合わせることをお勧めします。フィルタは後処理ではなくブロックに焦点を当てているためです。

InputFilterでどのような文字をブロックできますか?

任意の文字:スペース、文字、数字、特殊文字、Unicode文字。カスタムフィルタでは、Character.isLetter、isDigit、isWhitespaceを使用するか、ブラックリスト/ホワイトリストと比較して条件を定義します。フィルタはラテン文字のみ、キリル文字のみ、または特定の文字セットのみを許可できます。

InputFilterはプログラムによるテキスト変更でも機能しますか?

いいえ、InputFilterはユーザー入力またはクリップボードからの貼り付け時にのみ作動します。setText()でプログラム的にテキストが設定された場合、フィルタは適用されません。プログラムによるテキストの確認には、TextWatcher検証または設定前の明示的なチェックを使用してください。

まとめ

  • InputFilterはEditTextに表示される前に文字レベルで入力をフィルタリングおよびフォーマットするAndroidインターフェースです。
  • フィルタメソッドは入力を許可する場合はnull、ブロックする場合は“”、変更する場合は新しいCharSequenceを返します。
  • LengthFilterとAllCapsは長さ制限と大文字小文字変換のための標準Android SDKフィルタです。
  • カスタムフィルタはカスタム文字チェックロジックを持つInputFilterインターフェースを実装して作成します。
  • フィルタチェーンにより、順次実行される複数のルールを組み合わせることができます。
  • InputFilterとTextWatcherは競合せず、相互に補完します。前者は文字をブロックし、後者は変更に反応します。
  • プログラムによるテキスト変更(setText())はInputFilterを通過しません — 個別の検証が必要です。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください