这是一个有趣的错误,我已经能够始终如一地重现它。我想知道是否有人注意到它。我还找不到任何报告。
TextView小部件具有名为textAllCaps
的属性,该属性用于强制其中显示的所有文本全部大写。此属性自API级别14(冰淇淋三明治)以来一直在Android中使用。但是,我最近发现,如果您通过将其放入styles.xml中来将应用程序的“字体系列”设置为无衬线压缩,则:
<item name="android:fontFamily">sans-serif-condensed</item>
然后,当任何具有textAllCaps=true
的TextView的布局被夸大时,它就会因InflateException
而崩溃:
12-05 09:18:48.847 16727 16727 E AndroidRuntime: android.view.InflateException: Binary XML file line #49: Binary XML file line #49: Error inflating class TextView
12-05 09:18:48.847 16727 16727 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #49: Error inflating class TextView
12-05 09:18:48.847 16727 16727 E AndroidRuntime: Caused by: java.lang.ArrayIndexOutOfBoundsException: length=57; index=2491
以前有人遇到过吗?
答案 0 :(得分:1)
我已经看到了,将TextView style属性设置为应用程序主题样式可以防止崩溃。
示例:
<style names="MyAppTheme">
<item name="android:fontFamily">sans-serif</item>
</style>
然后:
<TextView
style="@style/MyAppTheme"
...
android:textAllCaps="true" />
编辑以获取其他信息:
进一步研究之后,我最大的猜测是该错误在于TextView代码中。最初的崩溃是indexOutOfBoundsException,在问题中显示为:
length=57; index=2491
我认为57元素列表是TextView可用的样式信息,而2491+元素列表是应用于TextView的样式信息,包括AppTheme信息。要应用textAllCaps
属性,可能需要位置2491处的样式项。除非明确设置,否则问题可能是TextView没有意识到额外的样式信息,因此,为什么上述修复可以解决该问题。
答案 1 :(得分:0)
这是一个已知的错误,可以在此处进行跟踪-https://issuetracker.google.com/issues/64053344。
这是您的快速解决方法。更改您的代码
发件人:
<style name="AppCompatTheme" parent="android:...">
<item name="fontFamily">sans-serif-condensed</item>
</style>
对此:
<style name="AppCompatTheme" parent="android:...">
<item name="fontFamily">@string/default_font</item>
</style>
并在strings.xml
文件中定义default_font。