#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() будет другой.