SpannableString: возможно ли применить два или более RelativeSizeSpans? - PullRequest
40 голосов
/ 21 октября 2011

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

enter image description here

Два символа (м, с) должны быть меньше остальных.Я попытался удержать весь текст в одной 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).

Ответы [ 4 ]

104 голосов
/ 23 марта 2012

Если вы все еще ищете ответ, у меня может быть решение. У меня были похожие проблемы. Я использовал 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));
13 голосов
/ 29 июня 2015

Вам не нужно 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 голосов
/ 05 сентября 2017

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

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

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

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

lblDescription.setText(TextUtils.concat(finalString));
1 голос
/ 28 апреля 2016

В моем проекте используется динамическая версия ответа 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);
}
...