46

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」のみが小さくなります。

デバッグでは、SpannablesがRelativeSizeSpanのインスタンスを1つだけ保持しているように見えることも示されました。つまり、1つのタイプのSpanは1つしか存在できません。これは本当の、または予想される動作ですか?代わりにTextViewを連結することをお勧めしますか?

編集:ちなみに、パフォーマンス上の理由から、ここでHTML.fromHtml()呼び出しを削除しようとしています(多くのGC呼び出し)。

4

4 に答える 4

118

あなたがまだ答えを探しているなら、私は解決策を持っているかもしれません。私も同様の問題を抱えていました。私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));
于 2012-03-23T15:32:39.787 に答える
14

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);
于 2015-06-29T15:27:36.613 に答える
3

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

この場合のように:

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

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

lblDescription.setText(TextUtils.concat(finalString));
于 2017-09-05T12:32:58.640 に答える
1

私のプロジェクトでは、動的バージョンの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);
}
于 2016-04-28T09:51:46.683 に答える