私は次のようにSpannableStringを構築しようとしています:
2文字(m、s)は、他の文字よりも小さくする必要があります。すべてのテキストを1つのSpannableStringに保持しようとしました。また、SpannableStringBuilderを介して2つのSpannableStringを連結しようとしました。 1つのSpannableのコードは次のようになります。
spannable.setSpan(new RelativeSizeSpan(0.75f), spannable.length() - 1, spannable.length(), 0);
ただし、1つの書式のみが適用されます-SpannableStringBuilderを使用する場合は「m」のみが小さく、テキスト全体に1つのSpannableStringを使用する場合は「s」のみが小さくなります。
また、デバッグにより、SpannableにはRelativeSizeSpanのインスタンスが1つしか保持されていないように見えることが示されました。つまり、1つのタイプのSpanは1つだけです。これは本当ですか、または予想される動作ですか?代わりにTextViewを連結することをお勧めしますか?
編集:ところで、パフォーマンス上の理由(多くのGC呼び出し)のために、ここでHTML.fromHtml()呼び出しを削除しようとしています。
まだ答えを探しているなら、解決策があるかもしれません。同様の問題がありました。 TextUtils
を使用して、2つのSpannableString
を連結しました。
コードの例を次に示します。
SpannableString span1 = new SpannableString("32m");
SpannableString span2 = new SpannableString("50s");
span1.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
span2.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
mTextView.setText(TextUtils.concat(span1," " ,span2));
2つの個別のSpannableStringは必要ありません。より短い解決策は次のとおりです。
SpannableString span1 = new SpannableString("32m50s");
span1.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
span1.setSpan(new RelativeSizeSpan(0.75f), 5, 6, 0);
mTextView.setText(span1);
SpannableStringの配列を使用できます。
この場合のように:
TextView lblDescription=(TextView ) findViewById(R.id.lblDescription);
SpannableString[] finalString = new SpannableString[stringSplit.length];
lblDescription.setText(TextUtils.concat(finalString));
私のプロジェクトでは、gberoの動的なバージョンの回答を使用しています。
public void updateTime(TextView tv) {
Calendar calendar = Calendar.getInstance();
SpannableString span = new SpannableString(
calendar.get(Calendar.HOUR_OF_DAY) + "h" + calendar.get(Calendar.MINUTE) + "m");
span.setSpan(new RelativeSizeSpan(0.75f), 2, 3, 0);
span.setSpan(new RelativeSizeSpan(0.75f), 5, 6, 0);
tv.setText(span);
}