java - 使用 getSpans 方法获取 Spannable 中的所有 Span

标签 java android spannablestring spannable spannablestringbuilder

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

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 时,我遇到了以下 ClassCastException(第 6 行)。

java.lang.ClassCastException: android.text.style.SpellCheckSpan cannot be cast to 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所以你可以阅读:

Thrown to indicate that the code has attempted to cast an object to a subclass of which it is not an instance. For example, the following code generates a ClassCastException:

因此,如果您想要进行cast,您必须确保该对象与您声明的对象类型相同,否则您将得到一个ClassCastException

关于java - 使用 getSpans 方法获取 Spannable 中的所有 Span,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58008311/

相关文章:

java - Android 将可点击文本设置为从一个 fragment 转到另一个 fragment

android - Lollipop 上的 TextView fromHtml 链接断开

java - HttpClient 关闭连接

java - C 整数与 Java 读取的字节并集并重新转换为 Java int

android - 禁用菜单按钮?

android - 在 Android 中访问菜单 XML 文件中的全局变量

java - 如何在Bundle中传递自定义对象?

android - 如何将资源文件夹中的自定义字体设置为 Android 中操作栏的标题?

java - 使用 Swing 定时器 : creating mess

java.lang.Exception : No Function Found on type: org. primefaces.util.ComponentUtils with signature : java. lang.String resolveWidgetVar(java.lang.String)