Android TextView文本占位符无法加粗问题求助
问题原因
Android 的 getString() 方法会自动转义字符串资源中的 HTML 标签,把 <b> 转换成 <b>、</b> 转换成 </b>。这就导致后续 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
相关产品推荐
相关产品推荐

