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"
谁知道为什么?
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);
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在某些情况下会执行自动转换,包括上面的代码.