【发布时间】:2021-04-22 09:12:12
【问题描述】:
我有一个值可以改变的文本视图。例如,它是压力。它可以有不同的长度 - 即 999.1 或 1010.2 hPa。
文字如下:
我需要为文本的第一部分(数字 - 1024.12)和文本的第二部分(度量单位)设置不同的文本样式。
到目前为止我已经尝试过:
-
使用 SpannableString 并将跨度设置为相同的可扫描字符串。
-
创建两个可扫描字符串,分别设置它们的跨度,连接两个可扫描字符串并将连接的可扫描字符串设置为文本到文本视图:
//the value of measurement
val spannable1 = SpannableString(button.customView.tvBottom.text.split(" ")[0])
//the unit of measurement
val spannable2 = SpannableString(button.customView.tvBottom.text.split(" ")[1])
spannable1.setSpan(R.style. Bold20Dark, 0, spannable1.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
spannable2.setSpan(R.style. Regular12Dark, 0, spannable2.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
val spannableString = spannable1.toString() + spannable2.toString()
button.customView.tvBottom.setText(spannableString)
阻止我的是数字及其长度的动态变化,所以如果它不断变化,我不知道如何设置一个稳定的范围。
不同的文本样式是指以下样式:
<style name="Bold20Dark">
<item name="android:textSize">20sp</item>
<item name="android:lineSpacingExtra">3sp</item>
<item name="android:textColor">@color/dark</item>
<item name="android:fontFamily">@font/fonr_bold</item>
</style>
<style name="Regular12Dark">
<item name="android:gravity">center_horizontal</item>
<item name="android:textSize">12sp</item>
<item name="android:lineSpacingExtra">4sp</item>
<item name="android:fontFamily">@font/font_regular</item>
<item name="android:textColor">@color/grey</item>
</style>
如果范围是可变的,有没有办法设置两种文本样式?谢谢。
【问题讨论】:
-
你可以有 2 个文本视图,一个用于数字,另一个用于单元
-
嗨!是的,我知道。但这会导致重构大量代码,因为文本视图位于作为模板的按钮中。
-
为什么不通过提取度量单位来拆分字符串,然后将跨度分别应用于两个子字符串并连接并设置为 textview
-
这将是每个属性的一个跨度。
RelativeSizeSpan、CustomTypefaceSpan、PaddingSpan和ForgroundColorSpan。 -
您可以在收到新文本时将这些配置附加到 SpannableStringBuilder。问题是什么?你想设置一次这些配置吗?
标签: android kotlin textview spannable android-spannable