2015-04-21 2 views
2

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

+1

Мы не можем использовать один и тот же экземпляр 'Span' для обозначения нескольких частей текста. Всякий раз, когда 'setSpan()' вызывается путем передачи экземпляра 'Span', предыдущий диапазон, помеченный этим экземпляром, очищается. Я думаю, зная этот факт, вы можете преодолеть эту проблему. Если меня не ответит, я отправлю ответ. –

+1

@ DurgadassS Да, это исправить мою проблему. Я действительно наткнулся на эту информацию до вашего сообщения из другого ответа здесь, а также проб и ошибок. Однако из того, что я помню, я никогда не мог найти эту информацию в самой документации. Не могли бы вы поместить свой комментарий в ответ, чтобы я мог принять его, чтобы эту информацию легче было найти в будущем? – mbm29414

ответ

3

Мы не можем использовать тот же экземпляр Span, чтобы отметить несколько частей текста. Когда setSpan() вызывается путем передачи экземпляра Span, предыдущий диапазон, отмеченный этим экземпляром, очищается. Я думаю, зная этот факт, вы могли бы решить эту проблему.