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

出力は「classandroid.text.SpannedString」です。

なんで?私はそれが"SpannableStringBuilder"であることを期待しています、私のキャスト(SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs;)は上記の例でエラーを出します。

さらに、テキストビューのバッファタイプを次のように設定すると、出力が「SpannableString」に変わります。android:bufferType="spannable"

誰もが理由を知っていますか?

4

1 に答える 1

8

1.(SpannableStringBuilder ssb_2 = (SpannableStringBuilder)cs;)機能しない理由は、 SpannableStringBuilderimplementsが原因ですCharSequence。つまり、CharSequence はそれにキャストできることを認識していません。ただし、逆の方法で行うこともできます。それは理にかなっていますか?

CharSequence は何もない/それ自体です

SpannableStringBuilder は次のとおりです: CharSequence、スパン可能、編集可能など...

2.なぜandroid:bufferType="spannable"うまくいくのかというと、あなたは私が上で言ったことをしているのです。SpannableStringを実装しているためCharSequence、現在はその子であるため、 に配置できますCharSequence

とにかく、あなたを入れる正しい方法はCharSequence次のようにSpannableStringBuilderすることです:

SpannableStringBuilder ssb_2 = SpannableStringBuilder(cs);

いくつかのポリモーフィズムをブラッシュアップしたいかもしれません:)しかし、これはSpannableStringBuilder のコンストラクター、または少なくともそれらの 1 つに関する Android ドキュメントで確認できます。


アップデート:

あなたがしていることに気づいたことから、何を使用する必要がありますCharSequenceか? TextView をそのままにしておきます。つまり、文字列として返されます。したがって、次のようなことを行う方が簡単です。

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

機能する理由は、String が CharSequence も実装しているためです。つまり、それを SpannableStringBuilder コンストラクターに として渡すこともできますCharSequence。Java は、上記のコードを含め、特定のケースで自動キャストを行います。

于 2012-12-05T04:19:09.913 に答える