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

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

введите здесь описание изображения

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

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

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

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

РЕДАКТИРОВАТЬ: Кстати, я пытаюсь удалить здесь вызов HTML.fromHtml() по соображениям производительности (многие вызовы GC).


person manmal    schedule 21.10.2011    source источник


Ответы (4)


Если вы все еще ищете ответ, у меня может быть решение. У меня были похожие проблемы. Я использовал 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));
person Norman    schedule 23.03.2012
comment
Также обратите внимание, что ClickableSpan не будет работать без textView.movementMethod = LinkMovementMethod.getInstance(). - person Bugs Happen; 24.12.2019

Вам не нужны 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);
person gbero    schedule 29.06.2015

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

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

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

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

lblDescription.setText(TextUtils.concat(finalString));
person AlexPad    schedule 05.09.2017

Я использую динамическую версию ответа 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);
}
person Hitesh Sahu    schedule 28.04.2016
comment
иногда это было бы неправильно. В вашем часе может быть начальный 0, а минуты могут быть двузначными или однозначными. И в этом случае ваша начальная/конечная точка для setSpan() будет другой. - person Alex; 12.07.2016