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"
任何人都知道为什么?
答案 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在某些情况下会执行自动转换,包括上面的代码。