gpt4 book ai didi

java - 在 SpannableStringBuilder 和 CharSequence 之间进行转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:44 24 4
gpt4 key购买 nike

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());

输出是“class android.text.SpannedString”

为什么?我希望它是“SpannableStringBuilder”,我的转换 (SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs;) 会给上面的例子带来错误。

另外,如果我将 TextView 的缓冲区类型设置为 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);

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


更新:

根据我对您所做工作的观察,使用 CharSequence 的必要性是什么?只需将 TextView 保持原样,这意味着它作为字符串返回。所以做这样的事情会更容易:

SpannableStringBuilder ssb_2 = SpannableStringBuilder(tv.getText());

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

关于java - 在 SpannableStringBuilder 和 CharSequence 之间进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13716031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com