Trong trường hợp bạn muốn tránh quá nhiều sự nhầm lẫn cho các dịch giả của mình, tôi đã nghĩ ra một cách để chỉ có một trình giữ chỗ trong chuỗi, sẽ được xử lý theo mã.
Vì vậy, giả sử bạn có chuỗi này trong chuỗi:
<string name="test">
<![CDATA[
We found %1$s items]]>
</string>
Và bạn muốn văn bản giữ chỗ có kích thước và màu sắc khác nhau, bạn có thể sử dụng điều này:
val textToPutAsPlaceHolder = "123"
val formattedStr = getString(R.string.test, "$textToPutAsPlaceHolder<bc/>")
val placeHolderTextSize = resources.getDimensionPixelSize(R.dimen.some_text_size)
val placeHolderTextColor = ContextCompat.getColor(this, R.color.design_default_color_primary_dark)
val textToShow = HtmlCompat.fromHtml(formattedStr, HtmlCompat.FROM_HTML_MODE_LEGACY, null, object : Html.TagHandler {
var start = 0
override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
when (tag) {
"bc" -> if (!opening) start = output.length - textToPutAsPlaceHolder.length
"html" -> if (!opening) {
output.setSpan(AbsoluteSizeSpan(placeHolderTextSize), start, start + textToPutAsPlaceHolder.length, 0)
output.setSpan(ForegroundColorSpan(placeHolderTextColor), start, start + textToPutAsPlaceHolder.length, 0)
}
}
}
})
textView.text = textToShow
Và kết quả: