Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.IndexOutOfBoundsException:设置范围(118…119)结束于长度118之外_Java_Android_Spannablestring - Fatal编程技术网

java.lang.IndexOutOfBoundsException:设置范围(118…119)结束于长度118之外

java.lang.IndexOutOfBoundsException:设置范围(118…119)结束于长度118之外,java,android,spannablestring,Java,Android,Spannablestring,我搜索了不同的问题,但没有找到关于我问题的具体信息。我正在通过选择颜色来更改文本颜色,并且可以成功地工作。但是,当我在键入颜色文本后开始删除编辑文本时,会出现此错误 myedittext.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {

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

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)
我现在像这样用两种颜色书写

现在当我保存它的时候。它只保存在粉红色中,并显示如下 但现在,当我再次保存它时,没有任何更改,它保存在我写的颜色中

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

您可以添加检查以确保
计数
大于之前的
,这至少表明文本已添加到字符串中

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

调用onTextChanged方法告诉您,在
字符序列
中,从
开始
的字符数
计数
刚刚替换了以前长度
的旧文本

发生的情况是,当用户按下backspace时,start位于字符序列的上限,即,如果之前有七个字符,则start为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) {
        }
    });
}
myedittext.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
如果(开始之前){
spannableString.setSpan(新的ForegroundColorSpan(Color.parseColor(txtColor)),开始,开始+1,Spannable.SPAN_独占\u独占);
}
}
@凌驾
公共无效后文本已更改(可编辑){
}
});
}

没有尝试过该代码,但它应该可以工作。这只是让你知道你做错了什么,你应该做什么。

谢谢你的解释。解决了我的问题Hi,所以我在这里面临一个新的问题,那就是当我尝试用两种颜色写文本,然后保存它,然后用第一种颜色保存文本。假设我先用红色写,然后用蓝色写,但它只保存所有红色文本。但当我再次保存时,它会显示红色和蓝色,再次保存时,它只会显示红色文本。请正确解释。请查找我添加的问题中的图像,并稍加解释。您是如何保存的?这似乎是另一个问题本身,你将帮助更多的人提出一个不同的问题。