setError для TextInputLayout показывает ошибку
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)
8 ответов
Дайте правильный стиль для вашего 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">
Хотя я не до конца понимал причину возникновения проблемы, он должен что-то сделать с тем, как 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>
Тема Sytle для 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>
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>
Решение @Sevastyan отлично подходит для использования XML-макета.
Однако, если у меня есть TextInputLayout и TextInputEditText, которые я создал программно, и я сделал это:
tilCode.setErrorEnabled(true);
tilCode.setErrorTextAppearance(R.style.error);
Я получу ошибку. Но просто:
tilCode.setErrorTextAppearance(R.style.error);
Работает для меня.
Используйте это никогда не нужно 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>
Используйте TextUtils
if(TextUtils.isEmpty(etFirstName.getText().toString()))
{
etFirstName.setError("Filed is mandatory!");
view = etFirstName;
}
Попробуйте код ниже, чтобы показать ошибку в TextInputLayout
:
tvFirstName.setErrorEnabled(true);
tvFirstName.setError("Please Enter firstName");