java - 我收到设置跨度错误设置跨度在 0 之前开始
问题描述
我收到以下错误,不知道我的代码有什么问题。当它的粗体和斜体时,斜体文本有时会被删除,有时不会,然后会出现此错误。
2018-11-10 19:34:03.032 16997-16997/com.pilum.apps.primalnotes E/AndroidRuntime:致命异常:主进程:com.pilum.apps.primalnotes,PID:16997 java.lang.IndexOutOfBoundsException:setSpan( -1 ... -1) 在 0 之前开始 在 android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1314) 在 android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:680) 在 android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:672) 在 com.apps。 primalnotes.Fragments.EditorFragment.italicText2(EditorFragment.java:393) 在 com.apps.primalnotes.Fragments.EditorFragment.access$300(EditorFragment.java:48) 在 com.apps.primalnotes.Fragments.EditorFragment$5.onClick(EditorFragment. java:129) 在 android.view.View.performClick(View.java:6877) 在 android.view.View$PerformClick.run(View.java:26069) 在 android.os.Handler.handleCallback(Handler.java:789) ) 在 android.os.Handler.dispatchMessage(Handler.java:98) 在 android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6938) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote. java:327) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
private void italicText2(){
boolean italicExists = false;
Spannable str = texto.getText();
int selStart = texto.getSelectionStart();
int selEnd = texto.getSelectionEnd();
StyleSpan[] styleSpans = texto.getText().getSpans(selStart, selEnd, StyleSpan.class);
for (StyleSpan styleSpan : styleSpans) {
int oldStyle = styleSpan.getStyle();
int spanStart = str.getSpanStart(styleSpan);
int spanEnd = str.getSpanEnd(styleSpan);
if (spanStart < texto.getSelectionStart()) {
str.setSpan(new StyleSpan(oldStyle), spanStart, selStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (spanEnd > texto.getSelectionEnd()) {
str.setSpan(new StyleSpan(oldStyle), selEnd, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (selEnd > selStart) {
if (oldStyle == Typeface.ITALIC) {
str.removeSpan(styleSpan);
italicExists = true;
}
if (oldStyle == Typeface.BOLD_ITALIC) {
str.setSpan(new StyleSpan(Typeface.BOLD), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
italicExists = false;
}
}
}
if (!italicExists) {
Log.d("Tag", "italic section entered");
if (styleSpans.length > 0) {
int lastSpanEnd = 0;
for (StyleSpan styleSpan : styleSpans) {
int oldStyle = styleSpan.getStyle();
int spanStart = str.getSpanStart(styleSpan);
int spanEnd = str.getSpanEnd(styleSpan);
if (spanStart > lastSpanEnd) {
str.setSpan(new StyleSpan(Typeface.ITALIC), lastSpanEnd, spanStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.d("TAG", "if italic");
}
lastSpanEnd = spanEnd;
str.removeSpan(styleSpan);
if (oldStyle == Typeface.BOLD) {
str.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.d("TAG", "Bold and Italic");
}
else {
**str.setSpan(new StyleSpan(Typeface.ITALIC), spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);**
Log.d("TAG", "else italic");
}
if (spanStart < texto.getSelectionStart()) {
str.setSpan(new StyleSpan(oldStyle), spanStart, selStart, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.d("TAG", "oldstyle italic");
}
if (spanEnd > texto.getSelectionEnd()) {
str.setSpan(new StyleSpan(oldStyle), selEnd, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.d("TAG", "old style end italic");
}
}
if (selEnd != lastSpanEnd) {
str.setSpan(new StyleSpan(Typeface.ITALIC), selStart, selEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
解决方案
推荐阅读
- regex - 使用正则表达式提取以获取域名 url 和用户名
- meteor - 流星导入错误:createApolloServer 不是函数
- angular - 使用 setTimeout 进行角度单元测试
- .net - 多对多自引用表 - guid Id 会自行更改
- foreach - Foreach 给出错误:错误 # args: 应该是 TCL 中的“foreach varList list ?varList list ...? command”
- java - 为线程编写一个舒适的暂停/停止方法
- c# - 在 lib 文件夹外创建自己的 nuget、程序集时使用外部 nuget 作为依赖项
- python - 使用 Pandas 读取空格分隔的三角矩阵,空单元格为零
- amazon-ec2 - 稳定 | EC2 供应和配置
- r - 以基线值作为固定效应的混合效应模型