Я пытаюсь собрать длинный бит текста (из нескольких разных частей данных) в качестве содержимого TextView
.Невозможно получить Spannable совершенно правильно
Я хотел бы каждая строка имеет следующую структуру:
{1} шт | {шт. 2}
Я хочу, чтобы каждый «{кусок 1} |» был светло-серого цвета. Я хочу, чтобы каждый «{кусок 2}» был темно-серого цвета.
Я определил оба эти цвета.
Я хочу, чтобы весь ярлык был специальным шрифтом, который я добавил в свое приложение.
Вот что я пытаюсь до сих пор:
// regularTf is a Typeface created from a font added to this app
mItemCodesLabel.setTypeface(regularTf);
SpannableStringBuilder builder = new SpannableStringBuilder();
ForegroundColorSpan ltGraySpan = new ForegroundColorSpan(R.color.light_gray);
ForegroundColorSpan dkGraySpan = new ForegroundColorSpan(R.color.dark_gray);
int index = 0;
for (int i = 0; i < codes.size(); i = i + 1) {
ParseObject code = codes.get(i);
String value = code.getString("value") + " | ";
if (i > 0) {
builder.append("\n");
index = index + 1;
}
builder.append(value);
builder.setSpan(ltGraySpan, index, index + value.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index = index + value.length();
String loc = code.getString("location");
builder.append(loc);
builder.setSpan(dkGraySpan, index, index + loc.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
index = index + loc.length();
}
mItemCodesLabel.setText(builder, TextView.BufferType.SPANNABLE);
Цвет текста для этой метки установлен в R.color.dark_gray
в моем файле макета.
Результаты, которые я вижу, несколько сбивают с толку. У меня есть два кода для элемента, а TextView
выглядит так:
{code 1 шт. 1} | {code 1 шт. 2} {код 2 шт. 1} | {код 2 шт. 2}
«{code 1 шт. 1} |» темно-серый. Остальное светло-серый.
Основываясь на нескольких учебниках, которые я читал по этой теме, я не вижу ничего плохого в своем коде, но я признаю, что вся тема «Spannable» все еще меня смущает. Я прихожу из iOS, и Spannable
кажется очень похожим на NSAttributedString
, но похоже, что я что-то упустил.
Мы не можем использовать один и тот же экземпляр 'Span' для обозначения нескольких частей текста. Всякий раз, когда 'setSpan()' вызывается путем передачи экземпляра 'Span', предыдущий диапазон, помеченный этим экземпляром, очищается. Я думаю, зная этот факт, вы можете преодолеть эту проблему. Если меня не ответит, я отправлю ответ. –
@ DurgadassS Да, это исправить мою проблему. Я действительно наткнулся на эту информацию до вашего сообщения из другого ответа здесь, а также проб и ошибок. Однако из того, что я помню, я никогда не мог найти эту информацию в самой документации. Не могли бы вы поместить свой комментарий в ответ, чтобы я мог принять его, чтобы эту информацию легче было найти в будущем? – mbm29414