You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Android Oreo中调用TextView.setText设置长文本触发IndexOutOfBoundsException

解决Android Oreo中长字符串资源设置到TextView的IndexOutOfBoundsException问题

我之前也碰到过一模一样的报错,结合你给出的日志和Android Oreo的系统特性,咱们一步步拆解问题并解决:

问题根源分析

从日志里的Bad string block: string #968 is not null-terminated和decoded length is not correct -1 vs 23209可以看出:

  • 你的第968号字符串资源存在格式或编码异常,没有正确的空终止符,导致系统解析时长度计算错误。
  • Android Oreo的StringBlock(负责解析字符串资源的核心类)对这种异常的容错性比高版本系统差,直接触发了IndexOutOfBoundsException。

具体解决方案

1. 检查并修复字符串资源本身

这是最核心的步骤:

  • 打开你的strings.xml,找到对应ID的长字符串(#968对应的资源),检查是否有这些问题:
    • 未闭合的HTML标签(比如只写了<i>没写</i>)
    • 未转义的特殊字符(比如双引号"没写成\",或者&没写成&amp;)
    • 字符串末尾有没有奇怪的不可见字符(可以复制到纯文本编辑器比如Notepad++查看)
  • 用Android Studio自带的XML检查工具(右键文件选Inspect Code)扫描资源文件,确认格式合法。

2. 换一种方式加载长文本

如果确认资源没问题但还是报错,可以绕过系统的字符串资源解析,直接从Assets加载:

  • 在项目的assets目录下新建一个long_text.txt文件,把你的长字符串粘贴进去。
  • 用以下代码读取文本并设置到TextView:
    private String loadLongTextFromAssets(Context context) {
        StringBuilder content = new StringBuilder();
        try (InputStream is = context.getAssets().open("long_text.txt");
             BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n"); // 保留换行,不需要的话可以去掉append("\n")
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return content.toString();
    }
    
    // 使用时
    TextView yourTextView = findViewById(R.id.your_text_view);
    yourTextView.setText(loadLongTextFromAssets(this));
    

3. 清理项目缓存并重新构建

有时候Android Studio的缓存会导致资源打包异常:

  • 执行Build > Clean Project,然后Build > Rebuild Project
  • 如果还是不行,删除项目根目录下的.gradle文件夹和模块目录下的.gradle文件夹,再重新同步Gradle

4. 排查ProGuard混淆问题

如果你的项目开启了混淆,可能是ProGuard错误处理了字符串资源:

  • 在proguard-rules.pro中添加以下规则,确保资源不被错误混淆:
    -keepresources string/**
    -keep class android.content.res.StringBlock { *; }
    

总结

这个问题90%以上是字符串资源的格式问题或者打包缓存导致的,优先检查资源本身,不行就换Assets加载的方式,基本都能解决Oreo上的崩溃问题。

内容的提问来源于stack exchange,提问作者MBH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:41:34