Kotlin中如何在TextView中实现时间格式里h字符的上标效果
解决方案
仅用单个TextView即可实现需求,不需要拆分多个控件,推荐两种常用的简便方案:
方案1:使用原生SpannableString实现(推荐,性能更优、样式可控性高)
安卓原生Span体系支持直接对字符串内的单个字符设置特殊样式,实现步骤如下:
- 构造完整的时间字符串,示例为
5h45'12" - 定位
h字符在字符串中的索引位置 - 给
h字符应用上标样式,还可按需调整字体大小、垂直偏移量
Java示例代码:
// 构造时间字符串 String timeStr = "5h45'12\""; SpannableString spannable = new SpannableString(timeStr); // 定位h的位置 int hIndex = timeStr.indexOf('h'); // 设置上标样式 spannable.setSpan(new SuperscriptSpan(), hIndex, hIndex + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 可选:调整上标字体大小为默认的70%,视觉效果更协调 spannable.setSpan(new RelativeSizeSpan(0.7f), hIndex, hIndex + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 给TextView设置内容 textView.setText(spannable);
Kotlin示例代码:
val timeStr = "5h45'12\"" val spannable = SpannableString(timeStr) val hIndex = timeStr.indexOf('h') spannable.setSpan(SuperscriptSpan(), hIndex, hIndex + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) spannable.setSpan(RelativeSizeSpan(0.7f), hIndex, hIndex + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) textView.text = spannable
方案2:使用HTML格式渲染(代码更简洁)
如果不需要复杂的样式定制,直接用HTML的<sup>标签包裹h字符,再给TextView设置渲染后的HTML内容即可:
// 构造带上标标签的HTML内容 String htmlTime = "5<sup>h</sup>45'12\""; // 兼容全版本的HTML渲染写法 textView.setText(HtmlCompat.fromHtml(htmlTime, HtmlCompat.FROM_HTML_MODE_LEGACY));
注意:Android 7.0及以上系统原生的
Html.fromHtml方法需要额外传入渲染模式参数,直接用androidx.core.text.HtmlCompat的API可避免版本兼容问题。
内容的提问来源于stack exchange,提问作者Artyum
相关产品推荐
相关产品推荐

