EditText error icon and show password missplaced

2020-01-23 21:30发布

问题:

I have an EditText as password input like this

<android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/prompt_password"
                android:imeActionId="@+id/login"
                android:imeActionLabel="@string/action_sign_in_short"
                android:imeOptions="actionUnspecified"
                android:inputType="textPassword"
                android:maxLines="1"
                android:singleLine="true" />

</android.support.design.widget.TextInputLayout>

It's working, but when there's an error the error icon shwon twice and it's on top of show password icon.

My validation code to show the error :

if (success) {
    finish();
    startMainActivity();
} else {
         mPasswordView.setError(getString(R.string.error_incorrect_password));
            mPasswordView.requestFocus();
}

回答1:

Don't call setError on the EditText, use TextInputLayout's setError()



回答2:

Same behavior for material version 1.1.0-alpha10, even if you set an error into TextInputLayout. You can avoid it by adding to the TextInputLayout this line :

app:errorIconDrawable="@null"



回答3:

With this code, you can remove toggle while showing the error. you can show toggle while user writing anything. Don't remember, you should give id to text input layout

public void showError(){
    password.setError(errorMessage);
    password.requestFocus();
    textInputLayout.setPasswordVisibilityToggleEnabled(false);
}


 password.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                textInputLayout.setPasswordVisibilityToggleEnabled(true);
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });


回答4:

It seems that it is a bug after updating gradle dependencies to 24+. Please, check this answer. I had all my setError() working fine before that. Plus, you hadn't to ask for focus in order to display the error.