0

我使用以下代码获取可跨字符串中的所有跨度。

SpannableStringBuilder str = new SpannableStringBuilder(editText.getText());
Object [] objectSpans = str.getSpans(0, str.length(), Object.class);

//loop through all spans
for (Object objSpan: objectSpans) {
   Spanned spanned = (Spanned) objSpan;// Here I encounter a ClassCastException
   start = spanned.getSpanStart(new Object());
   end = spanned.getSpanEnd(new Object());
   ...
}

当我想将 objSpan 强制转换为 Spanned 时(在第 6 行),我遇到了以下 ClassCastException。

java.lang.ClassCastException: android.text.style.SpellCheckSpan 不能转换为 android.text.Spanned

我怎么解决这个问题?有没有更好的方法来获取可跨字符串中的所有跨度?

4

2 回答 2

1

改用instanceof自动进行铸造。

for (Object objSpan: objectSpans) {
   if(objSpan instanceof Spanned){
    Spanned spanned = (Spanned) objSpan;// Here I encounter a ClassCastException
    start = spanned.getSpanStart(new Object());
    end = spanned.getSpanEnd(new Object());
    ...
   } 
}

要了解问题所在,您可以阅读此内容ClassCastException Documentation,以便阅读:

抛出以指示代码已尝试将对象强制转换为它不是实例的子类。例如,以下代码生成 ClassCastException:

所以,如果你想做一个cast,你必须确保该对象与你声明的对象类型相同,否则你会得到一个ClassCastException

于 2019-09-19T09:56:22.413 回答
0

检查 objSpan 是否是 Spanned 的实例。似乎@Skizo 和我的想法一样。因此对于重复的回答感到抱歉,但它也解决了我的问题。

SpannableStringBuilder str = new SpannableStringBuilder(editText.getText());
Object [] objectSpans = str.getSpans(0, str.length(), Object.class);

//loop through all spans
for (Object objSpan: objectSpans) {
   if(objSpan instanceof Spanned){
   Spanned spanned = (Spanned) objSpan;// Here I encounter a ClassCastException
   start = spanned.getSpanStart(new Object());
   end = spanned.getSpanEnd(new Object());
   ...
}
}
于 2019-09-19T10:07:47.450 回答