在SpannableStringBuilder和CharSequence之间进行转换

GMs*_*soF 4 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());
Run Code Online (Sandbox Code Playgroud)

输出是"class android.text.SpannedString"

为什么?我希望它是"SpannableStringBuilder",我的cast(SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs;)会给出上面例子的错误.

如果我设置文本视图的缓冲区类型,输出将更改为"SpannableString" android:bufferType="spannable"

谁知道为什么?

And*_*ndy 8

1.原因(SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs;)不起作用是因为SpannableStringBuilder实现CharSequence,意味着CharSequence不知道它可以被转换为那个.但是你可以反过来做.那有意义吗?

CharSequence是一个没有/本身

SpannableStringBuilder是:CharSequence,Spannable,Editable等...

2.至于为什么android:bufferType="spannable"工作的,你在做什么,我上面说的相反.自从SpannableString工具CharSequence,它现在是它的孩子,因此可以放入CharSequence.

但不管怎样,把你的正确方法CharSequenceSpannableStringBuilder是这样做的:

SpannableStringBuilder ssb_2 = SpannableStringBuilder(cs);
Run Code Online (Sandbox Code Playgroud)

您可能想要了解一些多态性:)但您可以在SpannableStringBuilder的构造函数的Android文档中看到这一点,或至少其中一个.


更新:

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

SpannableStringBuilder ssb_2 = SpannableStringBuilder(tv.getText());
Run Code Online (Sandbox Code Playgroud)

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

  • 很高兴为您提供帮助。干杯:) (2认同)