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

#android #spannablestring #spannable

#Android #spannablestring #охватываемый

Вопрос:

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

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

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

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

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

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

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

Ответ №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));
 

Комментарии:

1. Также обратите внимание, что ClickableSpan это не будет работать без textView.movementMethod = LinkMovementMethod.getInstance()

Ответ №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);
}
 

Комментарии:

1. иногда это было бы неправильно. Ваш час может давать начальный 0 или минута может быть двузначной или однозначной. И в этом случае ваша начальная / конечная точка для setSpan() будет другой.