如何在 TextView BOLD 上制作特定文本
Posted
技术标签:
【中文标题】如何在 TextView BOLD 上制作特定文本【英文标题】:how to make a specific text on TextView BOLD 【发布时间】:2021-09-25 17:28:49 【问题描述】:我不知道如何使 TextView 上的特定文本变为 BOLD。
是这样的
txtResult.setText(id+" "+name);
我希望输出是这样的:
1111尼尔
id
和 name
是我从数据库中检索到值的变量,我想将 id
设置为粗体,但只有 id
所以 name
不会受到影响,我有不知道该怎么做。
【问题讨论】:
Is it possible to have multiple styles inside a TextView?的可能重复 【参考方案1】:只需在 html 中构建您的字符串并设置它:
String sourceString = "<b>" + id + "</b> " + name;
mytextview.setText(Html.fromHtml(sourceString));
【讨论】:
由于 fromHtml( sourceString) 在 API 24 中已被弃用,您必须使用下一个代码:Spanned durationSpanned; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) durationSpanned = Html.fromHtml(durationFormatted,Html.FROM_HTML_MODE_LEGACY); else durationSpanned = Html.fromHtml(durationFormatted); 如果您正在本地化您的应用,这是唯一可行的选项。 这是一个很好的解决方案,但我发现它不适用于 @wtsang02 解决方案更理想Html.fromHtml()
现已弃用
你可以使用 text.text = HtmlCompat.fromHtml( ctx.getString(R.string.logout_confirm), HtmlCompat.FROM_HTML_MODE_COMPACT )【参考方案2】:
虽然您可以使用Html.fromHtml(),但您可以使用更原生的方法,即SpannableStringBuilder,这个post 可能会有帮助。
SpannableStringBuilder str = new SpannableStringBuilder("Your awesome text");
str.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), INT_START, INT_END, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView tv=new TextView(context);
tv.setText(str);
【讨论】:
如果此答案不起作用,请尝试在您的文本中附加可扩展字符串,例如:mSpannable.append(yourremainingtext); 对于没有先验知识的 Google 用户:INT_START/INT_END 是粗体开始和结束的位置。 如果你只需要对源字符串应用一些标记而不改变它,那么你最好使用 SpannableString 类 如果您需要本地化您的副本,这将完全中断。 INT_START 和 INT_END 在不同的本地化中会是不同的位置。 在有疑问时尝试理解代码在做什么。 int start 是你定义的一个数字,它是 span 的起始索引。尝试 0 作为开始,string.().size() 作为结束。【参考方案3】:首先:您不必担心使用来自Raghav Sood's answer 的性能缓慢的代码。
第二:在使用Kotlin的时候不需要写w3bshark's answer提供的扩展函数。
Finnaly:您需要做的就是使用来自 Google 的 Kotlin android-ktx library(请参阅 here 以查找更多信息以及如何将其包含在您的项目中):
// Suppose id = 1111 and name = neil (just what you want).
val s = SpannableStringBuilder()
.bold append(id)
.append(name)
txtResult.setText(s)
产生:1111尼尔
更新:
因为我认为它可以帮助其他人,也可以证明你能走多远,这里有更多用例。
当您需要以蓝色和斜体显示某些部分的文本时:
val myCustomizedString = SpannableStringBuilder()
.color(blueColor, append("A blue text ") )
.append("showing that ")
.italic append("it is painless")
当您需要以粗体和斜体显示文本时:
bold italic append("Bold and italic")
简而言之,bold
、append
、color
和 italic
是 SpannableStringBuilder
的扩展函数。您可以在official documentation 中看到另一个扩展功能,您可以从中思考其他可能性。
【讨论】:
这很好,但我认为每个与字符串相关的答案都应该考虑翻译。在某些语言中,句子中的单词的排序和结构可能完全不同,因此像这样的附加并不总是适用于某些情况。对于像 XML 中的数量字符串这样的东西也不理想。 @CoolMind 不会让你无法使用 Android KTX。您可以从 github.com/android/android-ktx 找到有关如何报告错误、提出功能建议或为该库做出贡献的信息。所以,它仍然是一个有效的参考。我已经更新了我的答案,以包含有关该库以及如何在您的项目中使用它的更多信息。 为这个现代解决方案和资源的人授予奖章!谢谢!!! 伙计们,你们辛苦了。我花了几个小时,你的解决方案非常优雅;-) 太棒了。使用 ktx 的最佳案例之一。【参考方案4】:我认为选择的答案没有提供令人满意的结果。我编写了自己的函数,它需要 2 个字符串;全文和要加粗的部分文本。
它返回一个 SpannableStringBuilder,其中 'text' 中的 'textToBold' 加粗。
我发现将子字符串设置为粗体而不将其包装在标签中的功能很有用。
/**
* Makes a substring of a string bold.
* @param text Full text
* @param textToBold Text you want to make bold
* @return String with bold substring
*/
public static SpannableStringBuilder makeSectionOfTextBold(String text, String textToBold)
SpannableStringBuilder builder=new SpannableStringBuilder();
if(textToBold.length() > 0 && !textToBold.trim().equals(""))
//for counting start/end indexes
String testText = text.toLowerCase(Locale.US);
String testTextToBold = textToBold.toLowerCase(Locale.US);
int startingIndex = testText.indexOf(testTextToBold);
int endingIndex = startingIndex + testTextToBold.length();
//for counting start/end indexes
if(startingIndex < 0 || endingIndex <0)
return builder.append(text);
else if(startingIndex >= 0 && endingIndex >=0)
builder.append(text);
builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
else
return builder.append(text);
return builder;
【讨论】:
你能提供一个如何在代码中使用它的例子吗? @MicroR 您需要传递两个字符串,第二个字符串需要是第一个字符串中包含的一段文本。例如makeSectionOfTextBold("这是一段很棒的文字。", "great"). 你应该用 if(textToBold != null && !textToBold.isEmpty()) 改变你的 if 语句 这个函数不期望子字符串可以在全文中出现多次。例如,在“我的用户名是姓名”中,它不能使第二个“姓名”加粗。 那么这个方法实际上应该命名为makeAllBold(text,textToBold)。【参考方案5】:正如 wtsang02 所说,使用 HTML 是一项昂贵的开销。只需使用本机解决方案。如果不必修改字符串,只需使用 SpannableString,而不是 SpannableStringBuilder。
String boldText = "id";
String normalText = "name";
SpannableString str = new SpannableString(boldText + normalText);
str.setSpan(new StyleSpan(Typeface.BOLD), 0, boldText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(str);
【讨论】:
【参考方案6】:如果你想使用 XML 中的字符串,你可以这样做:
strings.xml(“CDATA”部分很重要,否则不起作用)
<string name="test">
<![CDATA[
<b>bold!</b> normal
]]>
</string>
布局文件
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
android:layout_ android:layout_ tools:context=".MainActivity">
<TextView
android:id="@+id/textView" android:layout_ android:layout_
android:layout_gravity="center" />
</FrameLayout>
代码
textView.text = HtmlCompat.fromHtml(getString(R.string.test), HtmlCompat.FROM_HTML_MODE_LEGACY)
【讨论】:
这对我有用<string name="test"><b>text bold</b> other text</string>
。如果我写 <![CDATA[
则不起作用
@sara 现在再次测试,在带有 Q 的 Pixel 2 上。工作正常。在这里,我更新了它如何与 Kotlin 一起工作。请重试。
如果您使用自定义字体,这是可以接受的答案。向创作者致敬。【参考方案7】:
很简单,只需像这样关闭指定的文本,例如<b>"your text here:"</b>
<string name="headquarters">"<b>"Headquarters:"</b>" Mooresville, North Carolina, U.S.</string>
结果: 总部:美国北卡罗来纳州穆尔斯维尔
【讨论】:
这仅适用于从 xml 中使用字符串的情况。如果以编程方式调用此字符串,则 html 编码将被剥离。 这是最简单的答案,它也适用于我【参考方案8】:如果您使用 Kotlin,使用 core-ktx
会更容易,因为它提供了一个 domain-specific-language (DSL) 来执行此操作:
val string: SpannedString = buildSpannedString
bold
append("foo")
append("bar")
它提供的更多选项是:
append("Hello There")
bold
append("bold")
italic
append("bold and italic")
underline
append("then some text with underline")
最后,你可以:
textView.text = string
【讨论】:
【参考方案9】:根据@mladj0ni 的回答,我得到了下面的代码。问题是如果你使用 String.format,它会去掉 html 标记,所以你必须转义 strings.xml 中的括号符号:
strings.xml:
<string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
code.java:
String unspanned = String.format(Locale.US, "%s%s", getResources().getString(R.string. welcome_messages), 99);
Spanned spanned;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N)
spanned = Html.fromHtml(unspanned, Html.FROM_HTML_MODE_LEGACY);
else
spanned = Html.fromHtml(unspanned);
textView.setText(spanned);
它比 SpannableStringBuilder 更简单。至于性能,如果你只显示一个字符串,那么用户不会注意到额外的毫秒来解析它。
请参阅文档here。
【讨论】:
感谢 <b>...</b>【参考方案10】:如果您想将多个文本设置为粗体,这是一个更好的解决方案。我改进了 Eitan 的代码。谢谢艾坦。
public static SpannableStringBuilder makeSectionOfTextBold(String text, String... textToBold)
SpannableStringBuilder builder = new SpannableStringBuilder(text);
for (String textItem :
textToBold)
if (textItem.length() > 0 && !textItem.trim().equals(""))
//for counting start/end indexes
String testText = text.toLowerCase(Locale.US);
String testTextToBold = textItem.toLowerCase(Locale.US);
int startingIndex = testText.indexOf(testTextToBold);
int endingIndex = startingIndex + testTextToBold.length();
if (startingIndex >= 0 && endingIndex >= 0)
builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
return builder;
【讨论】:
【参考方案11】:您可以使用此代码将部分文本设置为粗体。对于粗体 html 标记之间的任何内容,它都会使其变为粗体。
String myText = "make this <b>bold</b> and <b>this</b> too";
textView.setText(makeSpannable(myText, "<b>(.+?)</b>", "<b>", "</b>"));
public SpannableStringBuilder makeSpannable(String text, String regex, String startTag, String endTag)
StringBuffer sb = new StringBuffer();
SpannableStringBuilder spannable = new SpannableStringBuilder();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find())
sb.setLength(0);
String group = matcher.group();
String spanText = group.substring(startTag.length(), group.length() - endTag.length());
matcher.appendReplacement(sb, spanText);
spannable.append(sb.toString());
int start = spannable.length() - spanText.length();
spannable.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), start, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.setLength(0);
matcher.appendTail(sb);
spannable.append(sb.toString());
return spannable;
【讨论】:
当它是斜体和粗体时,那么解决方案是什么?【参考方案12】:wtsang02 答案是最好的解决方法,因为 Html.fromHtml("") 现在已弃用。在这里,无论句子的大小如何,我都会为在动态使第一个单词加粗时遇到问题的人稍微增强一下。
首先让我们创建一个获取第一个单词的方法:
private String getFirstWord(String input)
for(int i = 0; i < input.length(); i++)
if(input.charAt(i) == ' ')
return input.substring(0, i);
return input;
现在假设你有一个像这样的长字符串:
String sentence = "friendsAwesomeName@gmail.com want's to be your friend!"
你希望你的句子像 yourAwesomeName@gmail.com 想成为你的朋友! 您所要做的就是 - 获取第一个单词并获取它的长度以使第一个单词变为粗体,如下所示:
String myFirstWord = getFirstWord(sentence);
int start = 0; // bold will start at index 0
int end = myFirstWord.length(); // and will finish at whatever the length of your first word
现在只需按照 wtsang02 的 步骤进行操作,如下所示:
SpannableStringBuilder fancySentence = new SpannableStringBuilder(sentence);
fancySentence.setSpan(new android.text.style.StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(fancySentence);
就是这样!现在您应该可以将长/短句中任意大小的单词加粗。
【讨论】:
【参考方案13】:public static Spanned getBoldString(String textNotBoldFirst, String textToBold, String textNotBoldLast)
String resultant = null;
resultant = textNotBoldFirst + " " + "<b>" + textToBold + "</b>" + " " + textNotBoldLast;
return Html.fromHtml(resultant);
试试这个。绝对有帮助
【讨论】:
【参考方案14】:在列表/回收器中搜索 char 时,使字符串的第一个 char 可跨越
ravi 和 ajay
以前像这样突出显示,但我想像下面这样
ravi and ajay OR ravi 和 ajay
为此,我搜索了单词长度,如果它等于 1,我将主字符串分成单词并计算单词起始位置,然后我搜索以 char 开头的单词。
public static SpannableString colorString(int color, String text, String... wordsToColor)
SpannableString coloredString = new SpannableString(text);
for (String word : wordsToColor)
Log.e("tokentoken", "-wrd len-" + word.length());
if (word.length() !=1)
int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
int endColorIndex = startColorIndex + word.length();
try
coloredString.setSpan(new ForegroundColorSpan(color), startColorIndex, endColorIndex,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
catch (Exception e)
e.getMessage();
else
int start = 0;
for (String token : text.split("[\u00A0 \n]"))
if (token.length() > 0)
start = text.indexOf(token, start);
// Log.e("tokentoken", "-token-" + token + " --start--" + start);
char x = token.toLowerCase().charAt(0);
char w = word.toLowerCase().charAt(0);
// Log.e("tokentoken", "-w-" + w + " --x--" + x);
if (x == w)
// int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
int endColorIndex = start + word.length();
try
coloredString.setSpan(new ForegroundColorSpan(color), start, endColorIndex,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
catch (Exception e)
e.getMessage();
return coloredString;
【讨论】:
【参考方案15】:我来这里是为了提供更新的解决方案,因为我对现有的答案不满意。
我需要一些适用于翻译文本并且没有使用Html.fromHtml()
的性能影响的东西。
如果您使用 Kotlin,这里有一个扩展功能,可以轻松地将文本的多个部分设置为 bold。这就像 Markdown 一样工作,如果需要,可以扩展以支持其他 Markdown 标签。
val yourString = "**This** is your **string**.".makePartialTextsBold()
val anotherString = getString(R.string.something).makePartialTextsBold()
/**
* This function requires that the parts of the string that need
* to be bolded are wrapped in ** and ** tags
*/
fun String.makePartialTextsBold(): SpannableStringBuilder
var copy = this
return SpannableStringBuilder().apply
var setSpan = true
var next: String
do
setSpan = !setSpan
next = if (length == 0) copy.substringBefore("**", "") else copy.substringBefore("**")
val start = length
append(next)
if (setSpan)
setSpan(StyleSpan(Typeface.BOLD), start, length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
copy = copy.removePrefix(next).removePrefix("**")
while (copy.isNotEmpty())
【讨论】:
【参考方案16】:你可以在builder中分别添加两个字符串,一个是spannedString,一个是普通字符串,这样就不用计算索引了。
val instructionPress = resources?.getString(R.string.settings_press)
val okText = resources?.getString(R.string.ok)
val spannableString = SpannableString(okText)
val spannableBuilder = SpannableStringBuilder()
spannableBuilder.append(instructionPress)
spannableBuilder.append(spannableString, StyleSpan(Typeface.BOLD), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
instructionText.setText(spannableBuilder,TextView.BufferType.SPANNABLE)
【讨论】:
【参考方案17】:这是我为此使用的 Kotlin 扩展函数
/**
* Sets the specified Typeface Style on the first instance of the specified substring(s)
* @param one or more [Pair] of [String] and [Typeface] style (e.g. BOLD, ITALIC, etc.)
*/
fun TextView.setSubstringTypeface(vararg textsToStyle: Pair<String, Int>)
val spannableString = SpannableString(this.text)
for (textToStyle in textsToStyle)
val startIndex = this.text.toString().indexOf(textToStyle.first)
val endIndex = startIndex + textToStyle.first.length
if (startIndex >= 0)
spannableString.setSpan(
StyleSpan(textToStyle.second),
startIndex,
endIndex,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
this.setText(spannableString, TextView.BufferType.SPANNABLE)
用法:
text_view.text="something bold"
text_view.setSubstringTypeface(
Pair(
"something bold",
Typeface.BOLD
)
)
.
text_view.text="something bold something italic"
text_view.setSubstringTypeface(
Pair(
"something bold ",
Typeface.BOLD
),
Pair(
"something italic",
Typeface.ITALIC
)
)
【讨论】:
【参考方案18】:如果粗体文本的位置是固定的(例如:如果在 textView 的开头),则使用两个具有相同背景的不同 textView。然后可以将其他textView的textStyle设置为粗体。
与单个 textView 相比,这将需要两倍的内存,但速度会提高。
【讨论】:
【参考方案19】:找到了一种方法,以防您想要处理多种语言的本地化,这很无聊,但它确实有效,假设我们想要这样:
英文:
没有付款已注册
西班牙语:
没有干草pagos registrados
你必须创建 3 个字符串
英语:
<string name="start_string">There are no</string>
<string name="middle_string">payments</string>
<string name="end_string">registered.</string>
<string name="string_format" translatable="false">%1$s %2$s %3$s</string>
西班牙语:
<string name="start_string">No hay</string>
<string name="middle_string">pagos</string>
<string name="end_string">registrados</string>
现在你可以这样做了:
val startSpanPosition = getString(R.string.start_string).length
val endSpanPosition = startSpanPosition + getString(R.string.middle_string).length
val mySpannableString = SpannableStringBuilder(String.format(getString(R.string.string_format),
getString(R.string.start_string), getString(R.string.middle_string))), getString(R.string.end_string)))
mySpannableString.setSpan(StyleSpan(Typeface.BOLD), spanStartPosition, endSpanPosition, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
【讨论】:
【参考方案20】:你的字符串资源
<resources>
<string name="your_string_resource_name">This is normal text<![CDATA[<b> but this is bold </b>]]> and <![CDATA[<u> but this is underline text</u>]]></string>
</resources>
你的java类
yourtextView.setText(getString(R.string.your_string_resource_name));
【讨论】:
您能分享一下您的使用情况吗?【参考方案21】:我使用此代码将特定单词加粗...
Spanned string = Html.fromHtml("Normal string <b>BOLD STRING</b>");
textView.setText(string);
【讨论】:
【参考方案22】:这段代码不是最简单的解决方案吗?
<string name="string">Please provide your <b>Name</b> properly</string>
只要你想用这个字符串就行了 :)
结果会是这样的:
请正确提供您的姓名
【讨论】:
【参考方案23】:我创建了一个静态方法,用于为 TextView 和 EditText 设置部分文本粗体
public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex)
if(!contentData.isEmpty() && contentData.length() > endIndex)
final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);
final StyleSpan bss = new StyleSpan(Typeface.BOLD); // Span to make text bold
final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text normal
sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
sb.setSpan(iss,endIndex, contentData.length()-1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
if(mView instanceof TextView)
((TextView) mView).setText(sb);
else if(mView instanceof EditText)
((EditText) mView).setText(sb);
另一个更自定义的代码
/*typeFaceStyle can be passed as
Typeface.NORMAL = 0;
Typeface.BOLD = 1;
Typeface.ITALIC = 2;
Typeface.BOLD_ITALIC = 3;*/
public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex,int typeFaceStyle)
if(!contentData.isEmpty() && contentData.length() > endIndex)
final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);
final StyleSpan bss = new StyleSpan(typeFaceStyle); // Span to make text bold
final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text italic
sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
sb.setSpan(iss,endIndex,contentData.length()-1,Spanned.SPAN_INCLUSIVE_INCLUSIVE);
if(mView instanceof TextView)
((TextView) mView).setText(sb);
else if(mView instanceof EditText)
((EditText) mView).setText(sb);
【讨论】:
【参考方案24】:这是我对带有大小写检查的动态字符串值的完整解决方案。
/**
* Makes a portion of String formatted in BOLD.
*
* @param completeString String from which a portion needs to be extracted and formatted.<br> eg. I am BOLD.
* @param targetStringToFormat Target String value to format. <br>eg. BOLD
* @param matchCase Match by target character case or not. If true, BOLD != bold
* @return A string with a portion formatted in BOLD. <br> I am <b>BOLD</b>.
*/
public static SpannableStringBuilder formatAStringPortionInBold(String completeString, String targetStringToFormat, boolean matchCase)
//Null complete string return empty
if (TextUtils.isEmpty(completeString))
return new SpannableStringBuilder("");
SpannableStringBuilder str = new SpannableStringBuilder(completeString);
int start_index = 0;
//if matchCase is true, match exact string
if (matchCase)
if (TextUtils.isEmpty(targetStringToFormat) || !completeString.contains(targetStringToFormat))
return str;
start_index = str.toString().indexOf(targetStringToFormat);
else
//else find in lower cases
if (TextUtils.isEmpty(targetStringToFormat) || !completeString.toLowerCase().contains(targetStringToFormat.toLowerCase()))
return str;
start_index = str.toString().toLowerCase().indexOf(targetStringToFormat.toLowerCase());
int end_index = start_index + targetStringToFormat.length();
str.setSpan(new StyleSpan(BOLD), start_index, end_index, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return str;
例如。 completeString = "我很大胆"
案例一
如果*targetStringToFormat* = "bold"
和*matchCase* = true
返回“我很大胆”(因为粗体!= BOLD)
案例二
如果*targetStringToFormat* = "bold"
和*matchCase* = false
返回“我是BOLD”
申请:
myTextView.setText(formatAStringPortionInBold("I am BOLD", "bold", false))
希望有帮助!
【讨论】:
【参考方案25】:如果有人使用数据绑定。我们可以这样定义绑定适配器
@BindingAdapter("html")
fun setHtml(view: TextView, html: String)
view.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY))
然后我们可以在 TextView 上使用它
app:html="@@string/bold_text"
粗体字在哪里
<string name="bold_text"><![CDATA[Part of text is <b>bold</b>]]></string>
【讨论】:
“setHtml”函数在哪里写? developer.android.com/topic/libraries/data-binding/… 基本上什么类都可以,只要你有注解 哦,这对我来说太奇怪了。谢谢你。您是否知道该主题的新手可能有一个不错的教程/示例? 我不知道教程。只需谷歌“android BindingAdapter”【参考方案26】:简单示例
在你的strings.xml中
<string name="str_privacy_policy">This is our Privacy Policy.</string>
如果您想将“隐私政策”特别设为粗体,请将字符串放在粗体标记之间。
像这样
<string name="str_privacy_policy">This is our <b>Privacy Policy.</b></string>
结果是
这是我们的隐私政策
【讨论】:
【参考方案27】:这是我使用正则表达式和 Kotlin 的方法
val BOLD_SPAN = StyleSpan(Typeface.BOLD)
fun TextView.boldMatches(regexString: String)
this.applyStyleSpanToMatches(regexString, BOLD_SPAN)
fun TextView.applyStyleSpanToMatches(regexString: String, span: StyleSpan)
this.text = this.text.toString().applyStyleSpanToMatches(regexString, span)
fun String.applyStyleSpanToMatches(regexString: String, span: StyleSpan): Spannable
val result = SpannableString.valueOf(this)
if(regexString.isEmpty()) return result
val pattern = try
Pattern.compile(regexString)
catch (e: PatternSyntaxException)
return result
val matcher = pattern.matcher(result)
while (matcher.find())
val start = matcher.start()
val end = matcher.end()
result.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return result
使用问题 可以这样应用:
txtResult.boldMatches(id)
【讨论】:
谢谢,我想申请列表只需将其添加到您的标签中
dangerouslySetInnerHTML=__html: "<p>Your html text here.<p>"
【讨论】:
以上是关于如何在 TextView BOLD 上制作特定文本的主要内容,如果未能解决你的问题,请参考以下文章
Android:将文本样式设置为 TextView 文本的一部分