You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android TextView文本占位符无法加粗问题求助

问题原因

Android 的 getString() 方法会自动转义字符串资源中的 HTML 标签,把 <b> 转换成 &lt;b&gt;、</b> 转换成 &lt;/b&gt;。这就导致后续 HtmlCompat.fromHtml() 解析时,会把这些转义后的内容当成普通文本,无法识别为加粗标签,所以占位符内容不会被加粗。

解决办法

方法一:修改字符串资源,避免标签转义

在字符串资源中用 CDATA 包裹整个内容,这样 getString() 就不会转义 HTML 标签:

<string name="this_is_base_note"><![CDATA[This is base note of group<b>%1$s</b>. It cannot be deleted individually but with the rest of the group.]]></string>

修改后,你原来的 Java 代码可以保持不变,HtmlCompat.fromHtml() 就能正确解析 <b> 标签,实现占位符内容加粗。

方法二:用 getText() 结合 Spannable 替换占位符

如果不想修改字符串资源,可以直接用 getText() 获取带原始样式的 Spanned 对象,再替换占位符:

// 获取带原始样式的文本
Spanned originalText = (Spanned) fragment.getText(R.string.this_is_base_note);
// 获取需要替换的分组标题
String groupTitle = db.getGroupTitleByExtNoteOrder(noteItemList.get(getAdapterPosition()).getNoteOrder());
String replacement = groupTitle != null ? " " + groupTitle : "";
// 替换占位符并保留样式
SpannableStringBuilder ssb = new SpannableStringBuilder(originalText);
int placeholderIndex = ssb.toString().indexOf("%1$s");
if (placeholderIndex != -1) {
    ssb.replace(placeholderIndex, placeholderIndex + 4, replacement);
}
// 设置到 TextView
yourTextView.setText(ssb);
额外检查点
  • 确认你的 TextView 没有设置 android:textAllCaps="true",这个属性会覆盖自定义文本样式
  • 确保使用的是 androidx.core.text.HtmlCompat(而非旧版 Html 类),且依赖版本足够新

内容的提问来源于stack exchange,提问作者user21172734

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:39:39