Jetpack Compose 如何实现字符串资源占位符内容单独加粗
Android字符串占位符加粗样式实现方案
共有两种常用的稳定实现方式:
方案1:使用Html类解析富文本
无需修改原有字符串资源定义,直接在代码中拼接样式标签后解析即可:
- 原有字符串资源保持不变:
<string name="my_string">Fancy string with an %1$s placeholder</string>
如果存在HTML标签自动转义的问题,可给字符串套上CDATA包裹:
<string name="my_string"><![CDATA[Fancy string with an %1$s placeholder]]></string>
- 代码实现逻辑:
// Kotlin 示例 val placeholder = "<strong>amazing</strong>" val rawContent = getString(R.string.my_string, placeholder) // Android 7.0及以上需指定解析flag val styledContent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Html.fromHtml(rawContent, Html.FROM_HTML_MODE_LEGACY) } else { Html.fromHtml(rawContent) } // 直接设置到文本控件即可 textView.text = styledContent
// Java 示例 String placeholder = "<strong>amazing</strong>"; String rawContent = getString(R.string.my_string, placeholder); CharSequence styledContent; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { styledContent = Html.fromHtml(rawContent, Html.FROM_HTML_MODE_LEGACY); } else { styledContent = Html.fromHtml(rawContent); } textView.setText(styledContent);
方案2:使用Spannable手动设置样式(性能更优)
不需要解析HTML,直接对原生字符串设置Span样式,开销更低:
// Kotlin 示例 val placeholder = "amazing" val fullContent = getString(R.string.my_string, placeholder) val spannable = SpannableString(fullContent) // 定位需要加粗的占位符文本区间 val boldStart = fullContent.indexOf(placeholder) val boldEnd = boldStart + placeholder.length // 设置粗体样式 spannable.setSpan( StyleSpan(Typeface.BOLD), boldStart, boldEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) textView.text = spannable
// Java 示例 String placeholder = "amazing"; String fullContent = getString(R.string.my_string, placeholder); SpannableString spannable = new SpannableString(fullContent); int boldStart = fullContent.indexOf(placeholder); int boldEnd = boldStart + placeholder.length(); spannable.setSpan( new StyleSpan(Typeface.BOLD), boldStart, boldEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); textView.setText(spannable);
内容的提问来源于stack exchange,提问作者Nicola De Fiorenze
相关产品推荐
相关产品推荐

