将setError属性设置为null后,TextInputLayout将删除EditText样式

时间:2015-09-29 10:58:36

标签: android

我想在我的新应用中使用TextInputLayout。我有这样的布局

***
    <android.support.design.widget.TextInputLayout
        android:id="@+id/input_layout_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:textColorHint="@color/text_color"
        app:hintTextAppearance="@style/HintTextAppearance.TextInputLayout"
        app:errorTextAppearance="@style/ErrorTextAppearance.TextInputLayout">

        <EditText
            android:id="@+id/input_email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress"
            android:hint="@string/hint_email"
            android:background="@drawable/edit_text_border_radius"
            android:padding="10dp"
            android:drawableLeft="@drawable/ic_acc"/>
    </android.support.design.widget.TextInputLayout>
 ***

在我的活动中,我的验证如下:

    private boolean validatePassword() {
            if (inputPassword.getText().toString().trim().isEmpty()) {
                inputLayoutPassword.setError(getString(R.string.err_msg_password));
                requestFocus(inputPassword);
                return false;
            } else {
                inputLayoutPassword.setError(null);// it removes @drawable/edit_text_border_radius style from EditText
                inputLayoutPassword.setErrorEnabled(false);      
            }

            return true;
     }

不正常。但好像你注意到我已经为EditText声明了@ drawable / edit_text_border_radius资源。如果我第一次不填写密码字段,它将改变背景颜色为红色。因为它是TextInputLayout错误范围的默认颜色。但是如果我用一些值填充相同的字段,那么红色错误跨度消失但EditText元素忘记它是之前设置为它的后台资源(@ drawable / edit_text_border_radius)。

1 个答案:

答案 0 :(得分:2)

不确定您是否找到了问题的解决方案,但我遇到了同样的问题。

深入了解TextInputLayout来源,特别是清除错误消息的逻辑,看起来EditText清除了它的背景颜色过滤器(在我的情况下,它变黑了) )。

我同时提出的快速而肮脏的解决方案是手动将背景过滤器重置为所需的颜色:

private boolean validatePassword() {
    if (inputPassword.getText().toString().trim().isEmpty()) {
        inputLayoutPassword.setError(getString(R.string.err_msg_password));
        requestFocus(inputPassword);
        return false;
    } else {
        inputLayoutPassword.setError(null);// it removes @drawable/edit_text_border_radius style from EditText
        inputLayoutPassword.setErrorEnabled(false);

        // manually resetting the background color filter of edit text
        if(inputLayoutPassword.getEditText() != null) {
            if(inputLayoutPassword.getEditText().getBackground() != null) {
                inputLayoutPassword.getEditText()
                    .getBackground()
                    .setColorFilter(
                        ContextCompat.getColor(getActivity(), R.color.some_color),
                        PorterDuff.Mode.SRC_IN
                    );
            }
        }
    }

    return true;
}