【问题标题】:java.lang.IndexOutOfBoundsException: setSpan (N ... N) ends beyond length 10500java.lang.IndexOutOfBoundsException: setSpan (N ... N) 结束超过长度 10500
【发布时间】:2018-07-02 06:29:41
【问题描述】:

当我打电话给EditText.setSelection()时,我得到了这个异常

java.lang.IndexOutOfBoundsException: setSpan (N ... N) ends beyond length 10500

N 可以是任意数字。例如,如果我调用 setSelection(10476,10568) N 将是 10568。但 10500 是恒定的。

          java.lang.IndexOutOfBoundsException: setSpan (10568 ... 10568) ends beyond length 10500
              at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1090)
              at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:665)
              at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:658)
              at android.text.Selection.setSelection(Selection.java:78)
              at android.widget.EditText.setSelection(EditText.java:91)
...

EditText 是否有任何限制导致此问题?

在进行选择之前,我会加载一个文本文件,该文件肯定包含超过 10500 个字符,因为它包含 ca. 12000 行。然后我调用EditText.setText() 将文件内容放入字段中。 EditText.setText() 工作没有任何问题。 First I thought there is something wrong with the file contents, but I loaded another file and when the selection occurred I got the same exception and it contained ends beyond length 10500

【问题讨论】:

  • 看起来 TextView (EditText) 的最大长度有限制。有一个很奇怪,但是将这么长的文本设置到TextView中绝对不是一个好主意。可能 10500 是您系统的内存限制。检查这个:groups.google.com/forum/#!topic/android-developers/JVAm8vBaIQg
  • @VladMatvienko EdiText 有什么替代方案来完成它?再次 setText() 工作。如果有限制,那么在那一刻失败并且不等到调用 setSelection() 是合乎逻辑的。
  • 文本可能会被截断为您的设备可以支持的任何内容。在您的情况下为 10500 个字符。
  • 解决方案可以是将文本拆分成更小的块,例如在 ListView 中使用多个 TextView。
  • 你设置成TextView后有检查过文本长度吗?是原装的还是10500的?

标签: java android android-edittext


【解决方案1】:

这是来自 android.text.SpannableStringBuilder 您的代码失败的实际方法。

private void checkRange(final String operation, int start, int end) {
    if (end < start) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " has end before start");
    }

    int len = length();

    if (start > len || end > len) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " ends beyond length " + len);
    }

    if (start < 0 || end < 0) {
        throw new IndexOutOfBoundsException(operation + " " +
                region(start, end) + " starts before 0");
    }
}

看起来您的开始/结束大于 EditText 中的长度(由length() 计算)。可能是截断情况。

就 EditText 可以容纳的字符数而言,不受 Android 操作系统的限制,但可能来自设备。请参阅Max 9000 characters in Android TextView?https://groups.google.com/forum/#!topic/android-developers/JVAm8vBaIQg

【讨论】:

  • 截断规则是什么?它是否记录在某处?
  • 我建议使用简单的 webview。使用 html 字符串。
  • 谢谢。但将来可能需要编辑文本。我通过您提供的链接之一使用 android:maxLength="1000000" 解决了它。但是我不喜欢它并将其视为临时解决方案。放置文本块并仅填充文本字段的可见区域会很棒。我不知道 EditText 是否提供了一些机制来做到这一点,或者它是委托给应用程序开发人员的。
  • 很高兴我能帮上忙。在您的情况下,网络视图不起作用吗?
【解决方案2】:

我在使用 AutoCompleteTextView 时遇到了这样的问题。问题是自动完成窗口会延迟打开。如果在此延迟期间您删除了文本,那么当您尝试打开窗口时,弹出窗口会尝试使用已删除的文本。避免这种情况的唯一方法是取消打开此窗口。这可以通过从该视图的 Handler 中删除所有操作来完成。 autoCompleteTextView.getHandler().removeCallbacksAndMessages(null);

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2018-07-12
    • 2020-05-31
    • 2019-01-25
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多