Доброго времени суток. Часто сталкиваюсь с задачей, когда необходимо создать сложную строку: поддержка разных стилей, цветов, размеров и т.д., всё это с поддержкой аргументов и в одном 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)} ")
}
Есть ли способы получше и какой из этих способов выбрали бы вы?
Строковые ресурсы являются обязательным требованием для поддержки локализации.
Сам пока остановился на втором варианте.