为 TextInputLayout 设置错误信息显示 setError

10

TextInputLayout工作正常,但尝试设置错误时会显示错误。

代码:

 if (etFirstName.getText().length() == 0) {
            etFirstName.requestFocus();
            tvFirstName.setError("Please enter firstname");
        } else {
            tvFirstName.setError(null);
            tvFirstName.setErrorEnabled(false);
        }

检查日志:

java.lang.RuntimeException: Failed to resolve attribute at index 24
            at android.content.res.TypedArray.getColor(TypedArray.java:401)
            at android.widget.TextView.<init>(TextView.java:692)
            at android.widget.TextView.<init>(TextView.java:629)
            at android.widget.TextView.<init>(TextView.java:625)
            at android.widget.TextView.<init>(TextView.java:621)
            at android.support.design.widget.TextInputLayout.setErrorEnabled(TextInputLayout.java:297)
            at android.support.design.widget.TextInputLayout.setError(TextInputLayout.java:344)

setError对TextView无效,只能用于EditText。如果要在TextView中使用,请参考此链接https://dev59.com/DWYr5IYBdhLWcg3wpbyQ。 - Vivek Mishra
这是一个TextInputLayout,而不是TextView。 - user4302606
tvFirstName 是什么? - Gabriele Mariotti
tvFirstName 是 TextInputLayout。 - user4302606
@sreekanth,你试过我的答案了吗? - Ranjithkumar
尝试这个:https://dev59.com/uV0a5IYBdhLWcg3wPWlN#42779409 - Asha Antony
8个回答

15

虽然我并不完全理解为什么会出现这个问题,但肯定与Android如何根据其状态将颜色应用于视图有关。

以下是我解决问题的方法:

1)定义自定义样式,仅用于错误(或提示)的样式:

在您的res/values/styles.xml中添加新的样式节点:

    <style name="error" parent="@android:style/TextAppearance">
        <item name="android:textColor">@color/colorAccent</item> <!--apply the color you wat here -->
        <item name="android:textSize">12dp</item>
    </style>

2)将样式应用到您的 TextInputLayout

同时确保指定 errorEnabled 属性:

<android.support.design.widget.TextInputLayout
        android:id="@+id/input_email_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        app:errorEnabled="true"
        app:errorTextAppearance="@style/error"
    >
        <android.support.design.widget.TextInputEditText
            android:id="@+id/input_email"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:inputType="textEmailAddress"
                  android:hint="@string/hint_email"/>
    </android.support.design.widget.TextInputLayout>

这应该是被接受的答案。只有这些步骤对我起作用。 - Vlad

7
为您的TextInputLayout提供有效的样式(android:theme="@style/Theme.AppCompat")。
<android.support.design.widget.TextInputLayout
  android:id="@+id/testingInputLayout"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:theme="@style/Theme.AppCompat">

<EditText
   android:id="@+id/testingEditText"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:hint="@string/testText"
   android:inputType="textEmailAddress" />

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

如果还没有添加,您需要添加appCompat和支持设计依赖项。

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

在您的清单文件中添加AppCompat主题,
<application
 ...
android:theme="@style/Theme.AppCompat">

只有我这样做才有效,即更改TextInputLayout的android:theme="@style/Theme.AppCompat",使用自定义主题时它不起作用,需要检查一下。 - user4302606
1
如果您需要自定义主题,请使用父主题 Theme.AppCompat 并编写您的自定义主题。 - Ranjithkumar
这部分在V5及以上版本中运行良好,我如何在V4.1及以上版本中展示相同的内容...主题颜色只是在V4.1和V5中显示不正确,我该如何使它们相同? - user4302606
使用单独的主题处理5及以上版本(values-v21文件夹)。v5以下版本使用相同的values文件夹。请参考单独主题的答案https://dev59.com/pF4b5IYBdhLWcg3w-14I#32423780。 - Ranjithkumar
如何在以下5个@Ranjith中更改浮动标签颜色 - user4302606
让我们在聊天中继续这个讨论 - user4302606

0

TextInputLayout的样式主题:

<style name="HintInputTextAppearance" parent="TextAppearance.AppCompat">
<item name="android:textColor">@color/input_floating_color</item>
<item name="android:textSize">22dp</item>
<item name="colorAccent">@color/input_floating_color</item>
</style>
<style name="InputTextAppearance" parent="TextAppearance.AppCompat">
<item name="android:textColor">#ff000000</item>
<item name="android:textColorHint">#ff000000</item>
<item name="android:textSize">24dp</item>
<item name="colorAccent">#ff000000</item>
</style>

<style name="ErrorTextAppearance" parent="TextAppearance.AppCompat">
<item name="android:textColor">#ffff0000</item>
<item name="android:textColorHint">#ffff0000</item>
<item name="android:textSize">18sp</item>
<item name="colorAccent">#ffff0000</item>
</style>

在布局中使用:

<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:id="@+id/name_signup"
app:errorEnabled="true"
app:errorTextAppearance="@style/ErrorTextAppearance"
app:hintTextAppearance="@style/HintInputTextAppearance"
android:layout_marginLeft="@dimen/left_margin_login"
android:layout_marginRight="@dimen/right_margin_login"
android:layout_height="match_parent">
    <android.support.design.widget.TextInputEditText
        android:layout_width="match_parent"
        android:textAppearance="@style/InputTextAppearance"
        android:layout_height="wrap_content"
        android:hint="Name" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:id="@+id/email_signup"
app:errorEnabled="true"
app:errorTextAppearance="@style/ErrorTextAppearance"
app:hintTextAppearance="@style/HintInputTextAppearance"
android:layout_marginLeft="@dimen/left_margin_login"
android:layout_marginRight="@dimen/right_margin_login"
android:layout_height="match_parent">
    <android.support.design.widget.TextInputEditText
        android:layout_width="match_parent"
        android:textAppearance="@style/InputTextAppearance"
        android:layout_height="wrap_content"
        android:hint="Email" />
</android.support.design.widget.TextInputLayout>

0

MainFragment.kt:

private fun onSubmit(){
   setErrorTextField(false)

}

 private fun setErrorTextField(error: Boolean){
         if(error){
            binding.textField.isErrorEnabled = true
            binding.textField.error = "Try again!"
         }else {
            binding.textField.isErrorEnabled = false
            binding.textInputEditText.text = null
         }
}

XML布局:

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/textField"
            style="@style/Widget.Unscramble.TextInputLayout.OutlinedBox"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/default_margin"
            android:hint="@string/enter_your_word"
            app:errorIconDrawable="@drawable/ic_error"
            app:helperTextTextAppearance="@style/TextAppearance.MaterialComponents.Subtitle1"
            app:layout_constraintBottom_toTopOf="@+id/submit"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView_instructions">

            <com.google.android.material.textfield.TextInputEditText
                android:id="@+id/text_input_edit_text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:inputType="textPersonName|textNoSuggestions"
                android:maxLines="1" />
        </com.google.android.material.textfield.TextInputLayout>

-1

@Sevastyan的解决方案非常适用于使用xml布局。

然而,如果我有一个TextInputLayout和一个TextInputEditText,我是通过编程方式创建的,并且我这样做了:

tilCode.setErrorEnabled(true);
tilCode.setErrorTextAppearance(R.style.error);

我会得到一个错误。但只是:

tilCode.setErrorTextAppearance(R.style.error);

对我来说可以正常工作。


-1

使用此代码无需引用 Theme.AppCompat

<com.google.android.material.textfield.TextInputLayout
                android:id="@+id/tv_metadata_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <com.google.android.material.textfield.TextInputEditText
                    android:id="@+id/tv_metadata_Details"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>

-3
使用TextUtils。
if(TextUtils.isEmpty(etFirstName.getText().toString()))
{
   etFirstName.setError("Filed is mandatory!");
   view = etFirstName;
}

这如何解决问题?editText.getText()具有@NonNull,这意味着无需检查其是否为空,原始代码有效! - Viktor Yakunin

-5
尝试使用以下代码来显示TextInputLayout中的错误:
 tvFirstName.setErrorEnabled(true);
 tvFirstName.setError("Please Enter firstName");

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