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

java.lang.IndexOutOfBoundsException: setSpan (118 ... 119) ends beyond length 118

我搜索了不同的问题,但没有发现任何关于我的问题的具体信息。我正在通过选择颜色来更改文本颜色并且工作成功但是当我在输入颜色文本后开始删除我的编辑文本时我收到此错误。

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.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)

我现在是这样用两种颜色写的

现在当我保存它的时候。它只保存粉红色并像这样显示我 但现在当我再次保存它而不做任何更改时,它以我写的颜色保存

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

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

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

调用 onTextChanged 方法是为了告诉您在 CharSequence s 内,从 start 开始的字符数 count 刚刚替换了长度为 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) {
        }
    });
}

未能尝试该代码,但它应该可以工作。这只是为了让您了解自己做错了什么以及应该做什么。