将TextView Text设置为静态文本崩溃(很少)使用ArrayIndexOutOfBoundSexception



通过简单地将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/theme

受影响的视图非常简单,如以下内容:

<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"
  }
}

最新更新