InputType は、テキストフィールドの入力データの性質とキーボードの動作を決定するAndroidの属性です。InputTypeの値は、入力クラス(テキスト、数値、電話、日付)と修飾子(複数行、自動修正、大文字、非表示入力)を組み合わせたビットマスクです。InputTypeは、表示されるキーボードの種類、入力文字のフィルタリング、オートフィルの動作に影響を与えます。Android Developers (2026) によると、InputTypeは正確なデータ入力を保証するための最も重要な属性の一つであり、編集可能なすべてのテキストフィールドに明示的に設定する必要があります。
重要なポイント
InputType は、テキストフィールドの入力モードをエンコードする整数定数(Int)です。Androidでは、android.text.InputTypeクラスで定義されています。InputTypeの値は、入力クラス(ビット0~4)と修飾子(ビット5~31)の2つの部分で構成されます。入力クラスは基本データ型(テキスト、数値、電話、日付)を定義します。修飾子は選択されたクラス内での動作を詳細化します。例えば、テキストクラスでは、自動修正、大文字、複数行入力を有効にできます。
InputType メカニズムは3つのレベルで機能します:Androidフレームワークレベルでは、どのInputConnectionが作成されるか(EditTextとIME間の接続)を決定します。IME(キーボード)レベルでは、表示する文字と入力の処理方法を指定します。アプリケーションレベルでは、EditTextに組み込まれたInputFilterを通じて文字をフィルタリングします。Android Source Code (AOSP, 2026) によると、ビットマスクは現在の値を返すTextView.getInputType()メソッドと、内部フィルターとIME接続を再構成するsetInputType()で処理されます。
InputType の重要な特徴は、セキュリティ上の理由から別のプロセスから読み取ることができないことです。これにより、入力タイプへのアクセスによるデータ盗難(フィールドがパスワードかどうかの判別など)を防ぎます。別のアプリケーションからInputTypeを読み取ろうとすると、デフォルトでTYPE_CLASS_TEXTが返されます。
// 基本的なInputType定数
InputType.TYPE_CLASS_TEXT // 0x0001 = 1
InputType.TYPE_CLASS_NUMBER // 0x0002 = 2
InputType.TYPE_CLASS_PHONE // 0x0003 = 3
InputType.TYPE_CLASS_DATETIME // 0x0004 = 4
// クラス抽出用マスク
InputType.TYPE_MASK_CLASS // 0x0000000F
Androidは4つの基本 InputType クラスを定義しています。各クラスは特定のデータカテゴリに対応し、対応するキーボードタイプをアクティブにします。クラスはビットマスクのビット0~4で指定され、TYPE_MASK_CLASS(0x0F)マスクで抽出できます。
| クラス | 定数 | キーボード | 用途 |
|---|---|---|---|
| TEXT | TYPE_CLASS_TEXT (1) | QWERTYキーボード | テキスト、コメント、説明 |
| NUMBER | TYPE_CLASS_NUMBER (2) | 数字 | 数量、価格、年齢 |
| PHONE | TYPE_CLASS_PHONE (3) | 電話 | 電話番号 |
| DATETIME | TYPE_CLASS_DATETIME (4) | 日付/時刻 | 日付、時刻 |
TYPE_CLASS_DATETIME は直接使用されることはほとんどありません。日付入力には通常、テキストフィールドではなくDatePickerやDatePickerDialogが使用されます。ただし、一部のシナリオ(手動での素早い日付入力)では、このクラスが役立つ場合があります。専用のキーボードはなく、通常は数字キーボードを表示します。
各入力クラスはバリエーション(ビット5~7で指定されるサブタイプ)と組み合わせることができます。例えば、TYPE_TEXT_VARIATION_PASSWORD(ビット5)はTEXTクラスに非表示入力を追加します。バリエーションビット:0x000000E0(TYPE_MASK_VARIATIONマスク)。
修飾子フラグ(ビット8~31)は、基本クラスに追加機能を提供します。キーボードの種類は変更しませんが、入力動作を変更します。フラグは各クラスに固有です。TEXTフラグはNUMBERでは機能せず、その逆も同様です。以下に各クラスの主な修飾子を示します。
Android Developers Documentation (2026) によると、異なるクラスのフラグは重複しません。NUMBERでTEXTフラグを使用しようとすると無視されます。設定されたフラグを確認するには、ビット単位のANDを使用します:(inputType and FLAG) != 0。
InputType のクラスとフラグの正しい組み合わせが、使いやすいフォームを作成する鍵です。典型的なシナリオとそれに対応するInputType設定を見てみましょう。各シナリオは特定のデータタイプの入力を最適化し、フォームを直感的にし、入力を高速化します。
| シナリオ | InputType | キーボード |
|---|---|---|
| 名前 | textCapWords | QWERTY、各単語の先頭大文字 |
| メール | textEmailAddress | QWERTY(@と.付き) |
| パスワード | textPassword | QWERTY、非表示入力 |
| 電話 | phone | 数字(+、#、*付き) |
| 価格 | numberDecimal | 数字(小数点付き) |
| 数量 | number | 数字のみ |
| コメント | textCapSentences|textMultiLine | QWERTY、複数行 |
| 検索 | text|textNoSuggestions | QWERTY(候補なし) |
// 価格フィールドの組み合わせ
editText.inputType = InputType.TYPE_CLASS_NUMBER or
InputType.TYPE_NUMBER_FLAG_DECIMAL
// コメントフィールドの組み合わせ
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or
InputType.TYPE_TEXT_FLAG_MULTI_LINE
setInputType() でプログラム的に InputType を設定すると、以前の値が上書きされます。マスクの一部のみを変更する必要がある場合(フラグの追加など)、現在の値を保存し、変更してから再度適用する必要があります。setInputType() を呼び出すたびに、EditTextの内部フィルターが再構成されます。
setRawInputType() メソッドは、フィルターや候補の再構成をトリガーしない点でsetInputTypeと異なります。EditTextの状態を完全に再読み込みせずに、InputTypeを一時的に変更するために使用されます。setInputType() を呼び出した後は、IMEを再起動してキーボードを更新することをお勧めします。
// パスワードと表示テキストの切り替え
fun togglePasswordVisibility(editText: EditText) {
val currentType = editText.inputType
val isPassword = (currentType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
editText.inputType = if (isPassword) {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
} else {
InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_PASSWORD
}
// カーソル位置を維持
val cursorPos = editText.selectionStart
editText.setSelection(cursorPos)
}
// 入力クラスを取得
fun getInputClass(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_CLASS
}
// 入力バリエーションを取得
fun getInputVariation(inputType: Int): Int {
return inputType and InputType.TYPE_MASK_VARIATION
}
// パスワードフィールドか確認
fun isPasswordField(editText: EditText): Boolean {
return (editText.inputType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
}
適切な InputType を選択することは、UXだけでなく、セキュリティとデータの正確性にも関わります。主な推奨事項は次のとおりです:すべてのEditTextに明示的なInputTypeを常に指定する;可能な限り最も具体的な入力クラスを使用する;異なるクラスのフラグを組み合わせない;機密データフィールドにはPASSWORDバリエーションを使用する;検索フィールドにはimeOptions="actionSearch"を使用する。
InputType はアクセシビリティサービスの動作にも影響します。textPasswordタイプのフィールドは、スクリーンリーダーから追加の保護を受けます。入力された文字を読み上げません。textEmailAddressフィールドの場合、スクリーンリーダーはユーザーにフィールドが電子メール用であることを通知し、適切な候補を提供します。
Material Design Guidelines (2025) によると、InputTypeはユーザーが入力するデータのタイプと一致する必要があります。誤ったInputTypeは入力を遅くするだけでなく、エラーの原因にもなります。例えば、電話番号フィールドにtextMultiLineを残すと、キーボードは数字キーパッドを表示せず、ユーザーは毎回手動でレイアウトを切り替える必要があります。
よくある質問
InputType は、ビットマスクを通じて入力データのタイプを定義するEditTextの属性です。Keyboard Typeは、InputTypeによってアクティブ化される視覚的なキーボードタイプの非公式な名称です。InputTypeは、キーボードレイアウトだけでなく、文字フィルタリング、自動修正、オートコンプリートにも影響します。
editText.inputType = InputType.TYPE_CLASS_TEXT を設定するか、完全にリセットするには定数 InputType.TYPE_NULL(0x00000000)を使用します。TYPE_NULLの場合、フォーカス時にフィールドはキーボードを表示しません。標準のテキスト入力に戻すには、フラグなしでTYPE_CLASS_TEXTを設定します。
InputTypeクラスはAndroidフレームワークの一部であるため、新しいクラスを作成することはできません。ただし、既存のクラスとフラグを組み合わせて、目的の動作を実現できます。setFilters() メソッドを使用してEditTextに設定される InputFilter を通じて、追加の文字フィルタリングを実装します。
InputType はInputConnectionを介して入力システムに渡されます。IMEはInputTypeクラスとバリエーションを読み取り、対応するキーボードレイアウトを選択します。例えば、TYPE_CLASS_NUMBERとTYPE_NUMBER_FLAG_DECIMALを組み合わせると、キーボードは小数点付きの数字キーパッドを表示します。最新のキーボードのほとんどはこれらの推奨事項に従っています。
Kotlinでは editText.inputType プロパティ、Javaでは editText.getInputType() を使用します。クラスを抽出するには、マスクを適用します:inputType and InputType.TYPE_MASK_CLASS。特定のフラグを確認するには:inputType and InputType.TYPE_TEXT_FLAG_MULTI_LINE — 結果が0以外の場合、フラグが設定されています。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。