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;
)会在上面的例子中给出错误。还有一些,如果我将文本 View 的缓冲区类型设置为
android:bufferType="spannable"
,输出将更改为“SpannableString”有谁知道为什么?
最佳答案
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);
您可能想复习一些多态性 :) 但您可以在 Android 文档中的 SpannableStringBuilder's 构造函数中看到这一点,或者至少是其中之一。
更新:
从我注意到你在做什么,有什么需要使用
CharSequence
?只需保持 TextView 不变,这意味着它作为字符串返回。所以做这样的事情会更容易:SpannableStringBuilder ssb_2 = SpannableStringBuilder(tv.getText());
有效的原因是因为 String 也实现了 CharSequence ,这意味着它也可以作为
CharSequence
传递到 SpannableStringBuilder 构造函数中。 Java 在某些情况下会自动转换,包括在上面的代码中。关于java - SpannableStringBuilder 和 CharSequence 之间的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13716031/