java.lang.IndexOutOfBoundsException:setSpan(118 ... 119)结束于长度118

时间:2018-12-02 20:52:14

标签: java android spannablestring

我搜索了不同的问题,但没有发现关于我的问题的具体信息。我正在通过选择颜色来更改文本颜色,并且可以成功运行,但是在键入颜色文本后开始删除编辑文本时,出现此错误。

myedittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            spannableString.setSpan(new ForegroundColorSpan(Color.parseColor(txtColor)), start, start+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        }
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
}

我收到以下错误

java.lang.IndexOutOfBoundsException: setSpan (118 ... 119) ends beyond length 118
    at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1309)
    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:680)
    at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:672)
    at com.apps.primalnotes.Fragments.EditorFragment$16.onTextChanged(EditorFragment.java:842)
    at android.widget.TextView.sendOnTextChanged(TextView.java:10611)
    at android.widget.TextView.handleTextChanged(TextView.java:10715)
    at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:14057)

我现在正在用两种颜色书写

enter image description here

现在保存时。它只保存为粉红色,并向我显示这样 enter image description here enter image description here 但是现在当我再次保存它而没有任何更改时,它保存为我写的颜色 enter image description here

2 个答案:

答案 0 :(得分:4)

调用onTextChanged方法可以告诉您在CharSequence s内,以count开始的字符数start已替换了长度为before的旧文本。

正在发生的情况是,当用户按下退格键时,开始位置是字符序列的上限,即如果您之前有七个字符,则开始位置为6,这与最后一个元素相同。您正在执行start+1,该数字始终超出索引范围。

myedittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(start < s.length() - 1 || count > before){
                spannableString.setSpan(new ForegroundColorSpan(Color.parseColor(txtColor)), start, start+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }

        }
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
}

无法尝试该代码,但它应该可以工作。只是为了向您展示您在做什么错和应该做什么。

答案 1 :(得分:3)

从字符串末尾删除文本时,将使用表示字符串现在较短的事实的值调用onTextChanged()方法。看起来您在编写代码时总是假设长度会更长;您正在为刚刚输入的字符着色。但是,如果您改为删除字符,则可能不想这样做。

您可以添加检查以确保count大于before,这至少表明该文本已添加到字符串中。

if (count > before) {
    spannableString.setSpan(...);
}