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;)将为上面的例子给出错误。
此外,如果我将文本视图的缓冲区类型设置为android:bufferType="spannable",则输出将更改为“SpannableString
有人知道为什么吗?
发布于 2012-12-05 12:19:10
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保持原样,就意味着它以字符串的形式返回。所以做这样的事情会更容易:
SpannableStringBuilder ssb_2 = SpannableStringBuilder(tv.getText());之所以有效,是因为String也实现了CharSequence,这意味着它也可以作为CharSequence传递到SpannableStringBuilder构造函数中。Java在某些情况下进行自动类型转换,包括在上面的代码中。
https://stackoverflow.com/questions/13716031
复制相似问题