在SpannableStringBuilder和CharSequence之间进行转换

时间:2012-12-05 03:55:15

标签: java android casting

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());

输出是“class android.text.SpannedString”

为什么呢?我希望它是“SpannableStringBuilder”,我的演员(SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs;)会给上面的例子带来错误。

如果我将文本视图的缓冲区类型设置为android:bufferType="spannable"

,则输出将更改为“SpannableString”

任何人都知道为什么?

1 个答案:

答案 0 :(得分:8)

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);

你可能想要了解一些多态性:)但是你可以在SpannableStringBuilder's构造函数的Android文档中看到这个,或者至少在其中一个。


<强>更新

从我注意到你正在做什么,有什么需要使用CharSequence?只需将TextView保留原样,即将其作为String返回。所以做这样的事情会更容易:

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

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