First_Spectr
@First_Spectr
Студент

Какой способ уместить разные стили в одной строке лучше?

Доброго времени суток. Часто сталкиваюсь с задачей, когда необходимо создать сложную строку: поддержка разных стилей, цветов, размеров и т.д., всё это с поддержкой аргументов и в одном TextView.

Пример задачи: покрасить слово UNKNOWN в строке UPDATE UNKNOWN TO %1$s в другой цвет.
Выделил 3 оптимальных способа это сделать:

//#1
//<string name="update_unknown">UPDATE UNKNOWN TO %1$s</string>
//<string name="selected">UPDATE UNKNOWN TO %1$s</string>

val span = SpannableString(getString(R.string.update_unknown, arg))
val selected = getString(R.string.selected)
val start = span.indexOf(selected)
span.setSpan(
	ForegroundColorSpan(requireContext().getColor(R.color.selectedColor)),
	start,
	start + selected.length,
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = span

//-------------------------------------------------------------------

//#2 Самый короткий, но нельзя вынести цвет в ресурсы.
//<string name="update_unknown_to_s"><![CDATA[UPDATE <font color="#6AE8EF">UNKNOWN</font> TO %1$s]]></string>

val text = getString(R.string.update_unknown_to_s, arg)
textView.text = HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_COMPACT)

//-------------------------------------------------------------------

//#3
//<string name="update">UPDATE UNKNOWN TO %1$s</string>
//<string name="unknown">UNKNOWN</string>
//<string name="to_s">TO %1$s</string>

textView.text = buildSpannedString {
	append("${getString(R.string.update)} ")
	color(getColor(R.color.selectedColor)) {
		append("${getString(R.string.unknown)} ")
	}
	append("${getString(R.string.to_s, arg)} ")
}

Есть ли способы получше и какой из этих способов выбрали бы вы?

Строковые ресурсы являются обязательным требованием для поддержки локализации.
Сам пока остановился на втором варианте.
  • Вопрос задан
  • 44 просмотра
Пригласить эксперта
Ответы на вопрос 2
@rPman
Вариант spinnedString предпочтительнее, он лаконичнее, меньше мест для ошибок, но многословен, с другой стороны в коде же не будешь только константы строки добавлять, тебе нужна раскраска от логики, а значит многословность уже не проблема.

Вариант с html на сколько я понимаю более универсален, его можно использовать с шаблонизатором, т.е. когда у тебя уже есть шаблоны сообщений и их нужно приводить к конечному виду, а собирать итоговый текст, размечая с помощью spinnedString может оказаться неудобно.

Так что исходя из задачи выбирай.
Ответ написан
@Shroud228
Ну надо выбирать из второго или первого, третий вообще не очень как-то. Ну а второй и первый - оба нормальные
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы