EditText错误图标和显示密码位置不正确

18

我有一个像这样的EditText用于输入密码:

<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>

它能正常工作,但当出现错误时,错误图标会显示两次,并且会覆盖显示密码图标。

错误图标错位

我的验证代码以显示错误:

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

请发布您的验证代码。 - user1688181
我已经更新了我的帖子。 - Lyan Dwi Pangestu
“success”变量是什么,你从哪里得到它的? - user1688181
mPasswordview是什么?它是EditText还是InputLayout? - user1688181
7个回答

60

不要在 EditText 上调用 setError 方法,而是应使用 TextInputLayoutsetError() 方法。


已经成功了,谢谢。我只是使用了Android Studio中的代码模板来创建LoginActivity。 - Lyan Dwi Pangestu
@Lyan Dwi Pangestu:你能发一下你成功的代码吗?我也遇到了类似的问题,很希望能看看你是怎么解决的。 - AJW
正如ianhanniballake所说,不要在EditText上调用setError,而是使用TextInputLayout的setError,它会在EditText下方显示错误消息,并且看起来很好。 - Lyan Dwi Pangestu
@Lyan Dwi Pangestu,如果你有时间能看一下我这里的输出吗:http://stackoverflow.com/questions/39360632/android-why-is-seterror-message-causing-view-distortion 。我想使用EditText,以便保留弹出消息框。非常感谢您提供的任何帮助。 - AJW
@ianhanniballake 我有一个类似的问题,并且正在尝试保留在EditText上使用setError(),以便我可以保留弹出式错误消息框。您能否对此提供任何帮助:http://stackoverflow.com/questions/39360632/android-why-is-seterror-message-causing-view-distortion - AJW
显示剩余5条评论

11

即使您将错误设置为TextInputLayout,材料版本1.1.0-alpha10的行为仍然相同。您可以通过在TextInputLayout中添加以下行来避免它:

app:errorIconDrawable="@null"


1
如果您想隐藏错误图标,以便仍然显示眼睛并能够设置错误描述,那么这就是您需要的答案 :) - Tyler Turnbull
1
谢谢。这正是我所需要的。@TylerTurnbull 我批准了。 :) - Daniel Galion

2
请在edittext中添加以下两行代码。
android:layout_marginEnd="9dp"
android:paddingRight="40dp"

1
使用此代码,您可以在显示错误时删除切换。当用户输入任何内容时,可以显示切换。不要忘记,您应该为文本输入布局提供ID。"最初的回答"
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) {

            }
        });

0

简单的解决方案

private static Drawable error;

error = getResources.getDrawable(R.drawable.nameOfIcon);

// use set bounds, here we use this to remove overlapping between error icon and password toggle.

error.setBounds(-50,0,0,error.getIntrinsicHeight());

//  error icon will show 50dp from right

editTextName.setError("error string",error);

-1

更新gradle依赖项到24+后似乎出现了一个bug。 请查看this答案。在那之前,我所有的setError()都能正常工作。此外,您不需要请求焦点才能显示错误。


-1
<com.google.android.material.textfield.TextInputEditText
  android:paddingEnd="40dp"
  android:inputType="textPassword"
/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接