4
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;) 将在上面的示例中给出错误。

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

有谁知道为什么?

4

1 回答 1

8

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

CharSequence 是一个虚无/本身

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

2.至于为什么android:bufferType="spannable"有效,你在做我上面说的,相反。由于SpannableStringimplements CharSequence,它现在是它的一个孩子,因此可以放置在CharSequence.

但无论如何,正确的方法CharSequenceSpannableStringBuilder

SpannableStringBuilder ssb_2 = SpannableStringBuilder(cs);

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


更新:

从我注意到你在做什么,有什么需要使用CharSequence?只需将 TextView 保持原样,这意味着它作为字符串返回。所以做这样的事情会更容易:

SpannableStringBuilder ssb_2 = SpannableStringBuilder(tv.getText());

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

于 2012-12-05T04:19:09.913 回答