我搜索了不同的问题,但没有发现关于我的问题的具体信息。我正在通过选择颜色来更改文本颜色,并且可以成功运行,但是在键入颜色文本后开始删除编辑文本时,出现此错误。
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)
我现在正在用两种颜色书写
答案 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(...);
}