Android 更新支持库 23.2.0 后达到 counterMaxLength 限制时,带有 TextInputLayout 的 EditText 崩溃
Android EditText with TextInputLayout crashing when reaching limit of counterMaxLength after update of Support Library 23.2.0
在我们的应用程序中,我们使用 EditText
和 TextInputLayout
来显示验证错误。一切正常,直到我们更新到最新的支持库 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.access0(TextInputLayout.java:82)
at android.support.design.widget.TextInputLayout.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
中设置的输入字符最大值时才会崩溃
设计库 23.2.0 版引入了 Theme.Design.*
主题系列,它们反映了 AppCompat 主题的一个子集,但在其之上定义了此属性:
<item name="textColorError">@color/design_textinput_error_color_light</item>
扩展您的主题 Theme.Design.*
或将以上行复制到您的主题中。
必须在您的主题中定义 textColorError
属性才能在 TextInputLayout
中使用错误状态。否则它会像你提到的那样崩溃。
你当然可以使用自己的错误颜色值。
浅色主题的默认值为 @color/design_textinput_error_color_light
,深色主题的默认值为 @color/design_textinput_error_color_dark
。
支持库26.x.x
如果您使用的是支持库版本 26+,它看起来像这样
<item name="textColorError">?attr/colorError</item>
适用于浅色和深色主题。
这是一个已经记录在此处的错误。直到 23.2.1 设计支持库才解决。
https://code.google.com/p/android/issues/detail?id=202051
同时您可以使用@Eugen 提到的解决方案。
只需删除您应用于 TextInputLayout 的样式。
这是由于 Light 和 Dark 主题的差异。它对我有用。
使用稳定的 material 库
实施 'com.google.android.material:material:1.0.0'
在我们的应用程序中,我们使用 EditText
和 TextInputLayout
来显示验证错误。一切正常,直到我们更新到最新的支持库 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.access0(TextInputLayout.java:82)
at android.support.design.widget.TextInputLayout.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
设计库 23.2.0 版引入了 Theme.Design.*
主题系列,它们反映了 AppCompat 主题的一个子集,但在其之上定义了此属性:
<item name="textColorError">@color/design_textinput_error_color_light</item>
扩展您的主题 Theme.Design.*
或将以上行复制到您的主题中。
必须在您的主题中定义 textColorError
属性才能在 TextInputLayout
中使用错误状态。否则它会像你提到的那样崩溃。
你当然可以使用自己的错误颜色值。
浅色主题的默认值为 @color/design_textinput_error_color_light
,深色主题的默认值为 @color/design_textinput_error_color_dark
。
支持库26.x.x
如果您使用的是支持库版本 26+,它看起来像这样
<item name="textColorError">?attr/colorError</item>
适用于浅色和深色主题。
这是一个已经记录在此处的错误。直到 23.2.1 设计支持库才解决。 https://code.google.com/p/android/issues/detail?id=202051
同时您可以使用@Eugen 提到的解决方案。
只需删除您应用于 TextInputLayout 的样式。 这是由于 Light 和 Dark 主题的差异。它对我有用。
使用稳定的 material 库
实施 'com.google.android.material:material:1.0.0'