web-dev-qa-db-ja.com

SpannableString:2つ以上のRelativeSizeSpansを適用できますか?

私は次のようにSpannableStringを構築しようとしています:

enter image description here

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()呼び出しを削除しようとしています。

40
manmal

まだ答えを探しているなら、解決策があるかもしれません。同様の問題がありました。 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));
104
Norman

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);
13
gbero

SpannableStringの配列を使用できます。

この場合のように:

TextView lblDescription=(TextView ) findViewById(R.id.lblDescription);

SpannableString[] finalString = new SpannableString[stringSplit.length];

lblDescription.setText(TextUtils.concat(finalString));
3
AlexPad

私のプロジェクトでは、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);
}
1
Hitesh Sahu