web-dev-qa-db-ja.com

edittextに値を入力した後のTextInputLayoutエラー

TextInputLayoutに1つのテキストを入力した後、EditTextエラーを非表示にするにはどうすればよいですか。出来ますか?

どうすればこれを達成できますか、ここで何か間違っています。!!

enter image description here

コード

    layoutEdtPhone =(TextInputLayout)rootView.findViewById(R.id.layoutEdtPhone);
    layoutEdtPhone.setErrorEnabled(true);
    layoutEdtPhone.setError(getString(R.string.ui_no_phone_toast));
    layoutEdtPassword =   (TextInputLayout)rootView.findViewById(R.id.layoutEdtPassword);
    layoutEdtPassword.setErrorEnabled(true);
    layoutEdtPassword.setError(getString(R.string.ui_no_password_toast));

    edtPhone=(EditText)rootView.findViewById(R.id.edtPhone);
    edtPassword=(EditText)rootView.findViewById(R.id.edtPassword);

xml

            <EditText
                Android:id="@+id/edtPhone"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="100dp"
                Android:background="@drawable/edt_background_selector"
                Android:drawableLeft="@drawable/phone_icon"
                Android:drawableStart="@drawable/phone_icon"
                Android:hint="@string/phone"
                Android:inputType="phone"
                Android:padding="5dip"
                Android:singleLine="true"
                Android:textSize="14sp" />
        </Android.support.design.widget.TextInputLayout>

        <Android.support.design.widget.TextInputLayout
            Android:id="@+id/layoutEdtPassword"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content" >

            <EditText
                Android:id="@+id/edtPassword"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:layout_marginTop="16dp"
                Android:background="@drawable/edt_background_selector"
                Android:drawableLeft="@drawable/password_icon"
                Android:drawableStart="@drawable/password_icon"
                Android:hint="@string/password"
                Android:inputType="textPassword"
                Android:padding="5dip"
                Android:singleLine="true"
                Android:textSize="14sp" />
        </Android.support.design.widget.TextInputLayout>
17
Kishore Jethava

Prithvirajの回答をさらに詳しく説明すると、TextInputLayoutは検証自体を行いません。これは、エラーまたはヒントを表示するための単なるメカニズムです。エラーを設定/クリアするのはあなたの責任です。以下にその方法を示します。 TextChangedListenerに加えて、ユーザーが最初のフィールドを変更せずに2番目の編集テキストにジャンプしたときにエラーを設定するために、OnFocusChangeListenerも必要になる場合があることに注意してください。

protected void onCreate(Bundle savedInstanceState) {
        //.....

        edtPhone.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                validateEditText(s);
            }
        });

        edtPhone.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    validateEditText(((EditText) v).getText());
                }
            }
        });
    }

    private void validateEditText(Editable s) {
        if (!TextUtils.isEmpty(s)) {
            layoutEdtPhone.setError(null);
        }
        else{
            layoutEdtPhone.setError(getString(R.string.ui_no_password_toast));
        }
    }
}
17
Ganesh Kumar

layoutEdtPhone.setErrorEnabled(false);を設定できます

11
fab

行う

mTextInputLayout.setError(null);

エラーメッセージをクリアします。

次のようなエラーをチェックする方法をお勧めします。

@Override
public void checkErrorBeforeAction() {

    boolean error = false;

    mTextInputLayout.setError(null);

    if (mEditText.getText().toString().length == 0)) {
        mTextInputLayout.setError("Field empty");
    }
    else if (mEditText.getText().toString().isValid) { // Other condition
        mTextInputLayout.setError("Field is invalid");
    }
    if (!error) {
        // Call action
    }
}

これにより、新しいエラーメッセージを設定する前にエラーメッセージが更新されます。

6
Teo Inke

ButterKnife の@TextChangedを使用し、私のために働いた、見てください:

@Bind(R.id.layoutEdtPhone)
TextInputLayout tlayoutEdtPhone;
@Bind(R.id.edtPhone)
EditText edtPhone;

//start ButterKnife (I spent the URL with full description for initilize)

@OnTextChanged(R.id.edtPhone)
public void changedTextOnEditPhone() {
    tlayoutEdtPhone.setError("");
}

ButterKnifeについて知りたい場合は、より詳細な記事を書きましたが、それは母国語、つまりpt_brで行われました。 http://blog.alura.com.br/aumentando-a-produtividade-com-butter-knife-no-Android/

5
Alex Felipe
textInputLatout.getEditText().addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.length() < 1) {
               textInputLayout.setErrorEnabled(true);
                textInputLayout.setError("Please enter a value");
            }

            if (s.length() > 0) {
                textInputLayout.setError(null);
                textInputLayout.setErrorEnabled(false);
            }

        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
2
Gowsik K C

残念ながら、この動作を実現する組み込みメカニズムはありません。私が助けてくれるViewUtilsクラスを作成しました:

public final class ViewUtils {
    private ViewUtils() {}

    public static void resetTextInputErrorsOnTextChanged(TextInputLayout... textInputLayouts) {
        for (final TextInputLayout inputLayout : textInputLayouts) {
            EditText editText = inputLayout.getEditText();
            if(editText != null) {
                editText.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {

                    }

                    @Override
                    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {

                    }

                    @Override
                    public void afterTextChanged(final Editable s) {
                        if(inputLayout.getError() != null) inputLayout.setError(null);
                    }
                });
            }
        }
    }
}

そして、クライアントコードで簡単に使用できます。

ViewUtils.resetTextInputErrorsOnTextChanged(mEmailTextInputLayout, mPasswordTextInputLayout);
0
Alex Misiulia

TextInputLayoutからエラー表示を削除する場合:

YourtextInputLayout.setErrorEnabled(false);

それ以外の場合は、edittextfieldからエラー表示を削除する場合:

edittext_id.setError(null);

より効率的な検証処理のために、AndroidでTextwatcher fucntionを使用することをお勧めします。

例えば:

editText.addTextChangedListener(new TextWatcher() { 
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                if (!validatefName()) {
                    return;
                }
            }
        });
0
user6602265