通过简单地将 TextViews
文本设置为在代码中定义的字符串(永远不能是 null
)我有时会得到一个 ArrayIndexOutOfBoundsException
,这只发生在我的实时应用程序中,我从来没有在任何测试设备上遇到过这个问题......而且它似乎只是有时会发生,用户告诉我它发生一次,下次一切正常。有什么想法可能是这里的原因吗?对我来说,看起来这种崩溃永远不会发生......
代码
我做以下事情:
fun updateFilterInfo(showing: Int, total: Int) {
binding?.tvFilterLvl1?.text = "$showing / $total" // <= THIS line creates the crash
}
崩溃
而且我时不时地(很少)遇到以下崩溃:
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at android.text.SpannableStringBuilder.getSpansRec(SpannableStringBuilder.java:973)
at android.text.SpannableStringBuilder.getSpans(SpannableStringBuilder.java:866)
at android.text.SpannableStringBuilder.getSpans(SpannableStringBuilder.java:836)
at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:1268)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:773)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:672)
at android.widget.TextView.setText(TextView.java:5981)
at android.widget.TextView.setText(TextView.java:5849)
at android.widget.TextView.setText(TextView.java:5806)
... above line of my code ...
版本/背景
我正在使用 android x,最新的稳定版本并且有这个问题......我也使用 kotlin 1.3.21
和 Gradle 插件 3.3.2
- 所有这些稳定且大部分是最新版本。另外,我确保用户不使用自定义 ROM,所以它也不可能是这样。
XML/主题
受影响的 View 非常简单,如下所示:
<TextView
android:id="@+id/tvFilterLvl1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:padding="4dp" />
这里没有自定义样式,我的项目中没有自定义字体(尽管永远不能排除系统范围的自定义字体)。我的基本应用主题没有定义自定义 TextView
样式并扩展了 Theme.MaterialComponents.Light.DarkActionBar.Bridge
。所以 XML 和主题都没有任何特殊的 TextView
处理......
编辑 1 - 我将值提取到局部变量
fun updateFilterInfo(showing: Int, total: Int) {
val text = "$showing / $total"
binding?.tvFilterLvl1?.text = text
}
我仍然遇到如下崩溃:
java.lang.NullPointerException: Attempt to invoke interface method 'void android.text.SpanWatcher.onSpanAdded(android.text.Spannable, java.lang.Object, int, int)' on a null object reference
at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:1228)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:767)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:677)
at android.text.DynamicLayout.<init>(DynamicLayout.java:187)
at android.widget.TextView.makeSingleLayout(TextView.java:6907)
at android.widget.TextView.makeNewLayout(TextView.java:6805)
at android.widget.TextView.checkForRelayout(TextView.java:7341)
at android.widget.TextView.setText(TextView.java:4482)
at android.widget.TextView.setText(TextView.java:4339)
at android.widget.TextView.setText(TextView.java:4314)
.... the line above: binding?.tvFilterLvl1?.text = text
最佳答案
试试
fun updateFilterInfo(showing: Int, total: Int) {
binding?.tvFilterLvl1?.let {
text = "$showing / $total"
}
}
关于android - 使用 ArrayIndexOutOfBoundsException 将 TextView 文本设置为静态文本崩溃(很少),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56201891/