ChatGPT解决这个技术问题 Extra ChatGPT

如何在 TextView BOLD 上制作特定文本

我不知道如何使 TextView 上的特定文本变为 BOLD。

就像这样

txtResult.setText(id+" "+name);

我希望输出是这样的:

第1111章

idname 是我从数据库中检索值的变量,我想让 id 变为粗体,但只有 id 所以 name 不会受到影响,我不知道如何去做这个。


R
Raghav Sood

只需在 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 )
C
Community

虽然您可以使用 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() 作为结束。
F
Filipe Brito

第一:您无需担心使用 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( “它是无痛的”)}

当您需要同时以粗体和斜体显示文本时:粗体 { 斜体 { append("Bold and italic") } }

简而言之,boldappendcoloritalicSpannableStringBuilder 的扩展函数。您可以在 official documentation 中看到其他扩展功能,从中您可以考虑其他可能性。


这很好,但我认为每个与字符串相关的答案都应该考虑翻译。在某些语言中,句子中的单词的排序和结构可能完全不同,因此像这样的附加并不总是适用于某些情况。对于 XML 中的数量字符串之类的东西也不理想。
@CoolMind 它不会让你无法使用 Android KTX。您可以从 github.com/android/android-ktx 找到有关如何报告错误、提出功能建议或为该库做出贡献的信息。所以,它仍然是一个有效的参考。我已经更新了我的答案,以包含有关该库以及如何在您的项目中使用它的更多信息。
为这个现代解决方案和资源给这个家伙一枚奖章!谢谢!!!
伙计们,你们让我开心。我花了几个小时,您的解决方案非常优雅;-)
精彩的。 ktx 使用的最佳案例之一。
D
Derek Beattie

我认为选择的答案没有提供令人满意的结果。我编写了自己的函数,它需要 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)。
J
Jadamec

正如 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);

a
android developer

如果您想使用 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_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content"
        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 一起工作。请再试一次。
如果您使用自定义字体,这是可以接受的答案。向创造者致敬。
@androiddeveloper FROM_HTML_MODE_LEGACY 这仍然是当前的方法吗?
@大卫我猜。奇怪的是它是“遗产”。我想知道我现在应该用什么代替......
R
Ridha Rezzag

它很简单,只需像这样关闭指定的文本,例如 <b>"your text here:"</b>

<string name="headquarters">"<b>"Headquarters:"</b>" Mooresville, North Carolina, U.S.</string>

结果:总部:美国北卡罗来纳州穆尔斯维尔


这仅适用于从 xml 使用字符串的情况。如果以编程方式调用此字符串,则 html 编码将被剥离。
这是最简单的答案,它也适用于我
D
Devansh Maurya

如果您使用的是 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

Y
Yusuf X

根据@mladj0ni 的回答,我得到了下面的代码。问题是,如果您使用 String.format,它会去除 html 标记,因此您必须转义 strings.xml 中的括号符号:

字符串.xml:

<string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>

代码.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>
K
Krish

如果您想让多个文本变为粗体,这里是更好的解决方案。我改进了 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;
}

l
live-love

您可以使用此代码将部分文本设置为粗体。对于粗体 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;
        }

当它是斜体和粗体时,那么解决方案是什么?
N
Nimantha

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 一样成为你的朋友!您所要做的就是 - 获取 firstWord 并获取它的长度以使 firstWord 加粗,如下所示:

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);

就是这样!现在您应该能够将长/短句中任意大小的单词加粗。


S
Saad Bilal
public static Spanned getBoldString(String textNotBoldFirst, String textToBold, String textNotBoldLast) {
    String resultant = null;

    resultant = textNotBoldFirst + " " + "<b>" + textToBold + "</b>" + " " + textNotBoldLast;

    return Html.fromHtml(resultant);

}

尝试这个。绝对有帮助


S
Sagar

在列表/回收器中搜索 char 时,使字符串的第一个 char 可跨越,例如

拉维和阿杰

以前像这样突出显示,但我想像下面这样

ravi 和 ajay 或 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;
}

w
w3bshark

我来这里是为了提供一个更新的解决方案,因为我对现有的答案并不满意。我需要一些适用于翻译文本并且不会影响使用 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())
    }
}

Е
Евелина Дервентска

您可以在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)

K
Knight Forked

这是我为此使用的 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
    )
)

A
Areeb Momin

我用这段代码加粗了特定的词......

    Spanned string = Html.fromHtml("Normal string <b>BOLD STRING</b>");
    textView.setText(string);

A
A.I.Shakil

这段代码不是最简单的解决方案吗?

<string name="string">Please provide your <b>Name</b> properly</string>

随心所欲地使用这个字符串:)

结果将是这样的:

请正确提供您的姓名


n
neens

如果粗体文本的位置是固定的(例如:如果在 textView 的开头),则使用两个具有相同背景的不同 textView。然后您可以将其他 textView 的 textStyle 设置为粗体。

与单个 textView 相比,这将需要两倍的内存,但速度会提高。


J
Jesus Almaral - Hackaprende

找到了一种方法,以防您想处理多种语言的本地化,这很无聊,但它确实有效,假设我们想要这个:

用英语讲:

没有注册的付款

在西班牙语中:

没有干草 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)

Y
Yıldırım

您的字符串资源

<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));

可以分享一下你的用法吗?
Z
Zar E Ahmer

我创建了一个静态方法来为 TextView 和 EditText 设置部分文本 Bold

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);
        }
    }

s
sud007

这是我对带有大小写检查的动态字符串值的完整解决方案。

/**
 * 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 = "我很大胆"

案例 I 如果 *targetStringToFormat* = "bold"*matchCase* = true

返回“我是 BOLD”(因为粗体!= BOLD)

案例 II 如果 *targetStringToFormat* = "bold"*matchCase* = false

返回“我很大胆”

申请:

myTextView.setText(formatAStringPortionInBold("I am BOLD", "bold", false))

希望有帮助!


l
logcat

如果有人正在使用数据绑定。我们可以像这样定义绑定适配器

@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”
A
Abdul Basit Rishi

简单示例

在你的 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>

结果将是

这是我们的隐私政策


D
Dmitry

这是我使用正则表达式和 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)

谢谢,我想申请 list,你能更新答案吗?谢谢
K
Kunal Mittal

只需将其添加到您的标签中

dangerouslySetInnerHTML={{__html: "<p>Your html text here.<p>"}}