首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SpannableStringBuilder和CharSequence之间进行转换

在SpannableStringBuilder和CharSequence之间进行转换
EN

Stack Overflow用户
提问于 2012-12-05 11:55:15
回答 1查看 4.9K关注 0票数 4
代码语言:javascript
复制
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

有人知道为什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的正确方法是这样做:

代码语言:javascript
复制
SpannableStringBuilder ssb_2 = SpannableStringBuilder(cs);

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

更新:

根据我对您正在做的事情的注意,使用CharSequence的必要性是什么?只要让TextView保持原样,就意味着它以字符串的形式返回。所以做这样的事情会更容易:

代码语言:javascript
复制
SpannableStringBuilder ssb_2 = SpannableStringBuilder(tv.getText());

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13716031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档