TextView tv = (TextView) findViewById(R.id.abc);
String rawString = "abcdefg";
SpannableStringBuilder ssb = new SpannableStringBuilder(rawString);
ssb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, rawString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(ssb);
CharSequence cs = tv.getText();
System.out.println(cs.getClass());

输出是“类android.text.SpannedString”

为什么?我希望它是“SpannableStringBuilder”,我的转换( SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs; )会在上面的例子中给出错误。

还有一些,如果我将文本 View 的缓冲区类型设置为 android:bufferType="spannable",输出将更改为“SpannableString”

有谁知道为什么?

最佳答案

1. 那么 (SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs;) 不起作用的原因是因为 SpannableStringBuilder 实现了 CharSequence ,这意味着 CharSequence 不知道它可以转换成那个。但是,您可以反过来做。那有意义吗?

CharSequence 是无/本身

SpannableStringBuilder 是一个 :CharSequence、Spannable、Editable 等...

2. 至于android:bufferType="spannable" 的工作原理,你正在做我上面说的,相反。由于 SpannableString 实现了 CharSequence ,它现在是它的子代,因此可以放在 CharSequence 中。

但无论如何,将 CharSequence 放入 SpannableStringBuilder 的正确方法是:

SpannableStringBuilder ssb_2 = SpannableStringBuilder(cs);

您可能想复习一些多态性 :) 但您可以在 Android 文档中的 SpannableStringBuilder's 构造函数中看到这一点,或者至少是其中之一。

更新:

从我注意到你在做什么,有什么需要使用 CharSequence ?只需保持 TextView 不变,这意味着它作为字符串返回。所以做这样的事情会更容易:
SpannableStringBuilder ssb_2 = SpannableStringBuilder(tv.getText());

有效的原因是因为 String 也实现了 CharSequence ,这意味着它也可以作为 CharSequence 传递到 SpannableStringBuilder 构造函数中。 Java 在某些情况下会自动转换,包括在上面的代码中。

关于java - SpannableStringBuilder 和 CharSequence 之间的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13716031/

10-11 15:05