TextInputLayout的setError显示错误

问题描述 投票:7回答:7

TextInputLayout工作正常,当试图设置Error它显示错误。

码:

 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)
android material-design android-design-library
7个回答
6
投票

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

10
投票

虽然我没有完全理解为什么会出现这个问题,但是必须要对Android如何根据状态将颜色应用于Views做一些事情。

这是我解决问题的方法:

1) Define custom style, that will be used only for styling the errors (or hints) only:

在你的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>

1
投票

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

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

但是,如果我有一个我以编程方式创建的TextInputLayout和TextInputEditText,我这样做了:

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

我会收到一个错误。只是:

tilCode.setErrorTextAppearance(R.style.error);

适合我。


0
投票

使用它,它永远不需要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>

-2
投票

使用TextUtils

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

-3
投票

尝试下面的代码来显示TextInputLayout中的错误:

 tvFirstName.setErrorEnabled(true);
 tvFirstName.setError("Please Enter firstName");
© www.soinside.com 2019 - 2024. All rights reserved.