支持库23.2.0更新后,当达到counterMaxLength限制时,带有TextInputLayout的Android EditText会崩溃。

21
在我们的应用中,我们使用EditTextTextInputLayout来显示验证错误。一切都很正常,直到我们更新到最新的支持库com.android.support:design:23.2.0后,当应用程序尝试在布局上显示错误时,它开始崩溃。
<android.support.design.widget.TextInputLayout
android:id="@+id/name_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:counterEnabled="true"
app:counterMaxLength="100"
>

<EditText
android:id="@+id/name_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/group_name"
android:inputType="textMultiLine|textCapWords"
android:textSize="16sp"/>
</android.support.design.widget.TextInputLayout>

代码:

    nameLayout.setError("Error);
    nameEditText.addTextChangedListener(new TextWatcher() {
 @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

@Override
public void afterTextChanged(Editable s) {
      nameLayout.setError(null);
}
}
});

错误:

    FATAL EXCEPTION: main
Process: im.grouvi.app.debug, PID: 10704
java.lang.UnsupportedOperationException: Failed to resolve attribute at index 3: TypedValue{t=0x2/d=0x7f01010b a=2}
    at android.content.res.TypedArray.getColorStateList(TypedArray.java:482)
    at android.widget.TextView.setTextAppearance(TextView.java:2757)
    at android.support.design.widget.TextInputLayout.updateCounter(TextInputLayout.java:681)
    at android.support.design.widget.TextInputLayout.access$300(TextInputLayout.java:82)
    at android.support.design.widget.TextInputLayout$1.afterTextChanged(TextInputLayout.java:242)
    at android.widget.TextView.sendAfterTextChanged(TextView.java:8004)
    at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10165)
    at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1043)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:560)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:492)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:491)
    at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:685)
    at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:445)
    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:340)
    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

编辑

经过更多测试,只有在达到counterMaxLength设置的输入字符最大值时才会崩溃。


在Android Studio中,Gradle会显示最新库的版本号提示。因此,23.2.0是正确的版本号。 - Rafael
4个回答

40

设计库的23.2.0版本引入了Theme.Design.*主题系列,与AppCompat主题的子集相似,但在其顶部定义此属性:

<item name="textColorError">@color/design_textinput_error_color_light</item>

要么让你的主题扩展Theme.Design.*,要么将上面那行代码复制到你的主题中。

为了在TextInputLayout中使用错误状态,必须在你的主题中定义textColorError属性。否则就像你所提到的那样,它会崩溃。

当然,你可以使用自己的错误颜色值。

默认值为@color/design_textinput_error_color_light(亮色主题)和@color/design_textinput_error_color_dark(暗色主题)。

支持库26.x.x

如果你使用的是支持库版本26+,它看起来像这样:

<item name="textColorError">?attr/colorError</item>

适用于明亮和暗黑主题。


我曾经遇到过同样的问题,这个方法解决了它。我使用了在我的主题中实现textColorError的解决方案。 - Sandra

2

1

只需移除您应用于TextInputLayout的样式即可。这是由于浅色和深色主题之间的差异导致的。对我来说起作用了。


0

使用稳定的 Material 库
实现 'com.google.android.material:material:1.0.0'


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