使用 getSpans 方法获取可跨度中的所有跨度



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

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

如何解决这个问题?有没有更好的方法可以在可跨度字符串中获取所有跨度?

使用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

检查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());
...
}
}

相关内容

  • 没有找到相关文章

最新更新