我使用以下代码获取可跨度字符串中的所有跨度。
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());
...
}
}