EditText error icon and show password missplaced

2020-01-23 20:54发布

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.

error icon missplaced

My validation code to show the error :

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

4条回答
Ridiculous、
2楼-- · 2020-01-23 21:24

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楼-- · 2020-01-23 21:26

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楼-- · 2020-01-23 21:27

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

查看更多
ら.Afraid
5楼-- · 2020-01-23 21:27

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.

查看更多
登录 后发表回答