Подтвердить что ты не робот

SpannableString: Можно ли применить два или более RelativeSizeSpans?

Я пытаюсь построить SpannableString так, чтобы он выглядел следующим образом:

enter image description here

Два символа (m, s) должны быть меньше остальных. Я попытался сохранить весь текст в одной SpannableString, и я также попытался объединить два SpannableStrings через SpannableStringBuilder. Код для одного Spannable выглядит так:

spannable.setSpan(new RelativeSizeSpan(0.75f), spannable.length() - 1, spannable.length(), 0);

Однако применяется только одно форматирование - при использовании SpannableStringBuilder только "m" меньше, и при использовании одной SpannableString для всего текста только "s" меньше.

Отладка также показала, что Spannables, похоже, содержит только один экземпляр RelativeSizeSpan, то есть может быть только один диапазон одного типа. Это истинное или ожидаемое поведение? Было бы целесообразно объединить TextViews вместо?

EDIT: Кстати, я пытаюсь удалить вызов HTML.fromHtml() здесь по причинам производительности (многие вызовы GC).

4b9b3361

Ответ 1

Если вы все еще ищете ответ, у меня может быть решение. У меня были подобные проблемы. Я использовал 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

Вам не нужно 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);

Ответ 3

Вы можете использовать массив SpannableString.

Как в этом случае:

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

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

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

Ответ 4

У меня есть динамическая версия ответа 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);
}