7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Android】テキスト入力が正しくない時に該当のEditTextにエラーを表示する

Posted at

概要

例えばログインフォームで情報を入力してログインしようとした時に、メールアドレスやパスワードが間違っていた場合などにエラーメッセージを表示したい。該当項目の入力欄の近くに表示する方法をまとめる。
スクリーンショット 2020-02-28 17.56.09.png

今回はマテリアルデザインのTextInputLayoutを用いた。

EditTextにエラーを表示する

fragment_form.xml
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/emailField"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="メールアドレス"
                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
                <EditText
                    android:id="@+id/emailText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textEmailAddress"/>
            </com.google.android.material.textfield.TextInputLayout>
            <com.google.android.material.textfield.TextInputLayout
                android:id="@+id/passwordField"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="パスワード"
                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
                <EditText
                    android:id="@+id/passwordText"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="textPassword"/>
            </com.google.android.material.textfield.TextInputLayout>
        </LinearLayout>

setError("string")(もしくはtextInputLayout.error = "string")で、エラーを表示させたいEditTextの外側のTextInputLayoutにエラー文をセットする。

FormFragment.kt
class FormFragment : Fragment() {
    private lateinit var emailTextInput: TextInputLayout
    private lateinit var emailEditText: EditText
    private lateinit var passwordTextInput: TextInputLayout
    private lateinit var passwordEditText: EditText

    ... ()

    private fun setError() {
        if (emailEditText.text.isEmpty()) {
            emailTextInput.setError("メールアドレスを入力してください")
        } else if (emailEditText.text.toString() == "a") {
            emailTextInput.error = "aです"
        }
        if (passwordEditText.text.isEmpty()) {
            passwordTextInput.setError("パスワードを入力してください")
        }
    }
}

これで、該当のEditTextの下にエラーメッセージが表示される。
スクリーンショット 2020-02-28 18.00.58.png

おまけ: 共通エラー表示

例えば、ログインしようとしてサーバとの通信に失敗した時に「通信に失敗しました」などと表示したいことがある。
その場合はTextViewなどを置いて失敗した時にエラーメッセージをセットすれば良い。

fragment_form.xml
    ... (略)
        <TextView
            android:id="@+id/login_form_error_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#FF0000" />
    </LinearLayout>
FormFragment.kt
    private fun setError() {
        if (emailEditText.text.isEmpty() && passwordEditText.text.isEmpty()) {
            errorText.text = "通信に失敗しました"
        } else {

        ... ()

スクリーンショット 2020-02-28 18.17.03.png

余談: 背景色が緑色なのは、これと同じプロジェクトを使っており、Fragmentの別を分かりやすくするためであるが、今回は別Fragmentは必要なかった。
上記リンクの記事には赤背景と青背景のFragmentが登場する。次何色にしよう

まとめ

TextInputLayoutを使って、EditTextにエラーを表示した。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?