【问题标题】:how to make a specific text on TextView BOLD如何在 TextView BOLD 上制作特定文本
【发布时间】:2021-09-25 17:28:49
【问题描述】:

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

是这样的

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

我希望输出是这样的:

1111尼尔

idname 是我从数据库中检索到值的变量,我想将 id 设置为粗体,但只有 id 所以 name 不会受到影响,我有不知道该怎么做。

【问题讨论】:

标签: android textview android-textattributes


【解决方案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") } }
    

简而言之,boldappendcoloritalicSpannableStringBuilder 的扩展函数。您可以在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_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)
    

    【讨论】:

    • 这对我有用&lt;string name="test"&gt;&lt;b&gt;text bold&lt;/b&gt; other text&lt;/string&gt;。如果我写 &lt;![CDATA[ 则不起作用
    • @sara 现在再次测试,在带有 Q 的 Pixel 2 上。工作正常。在这里,我更新了它如何与 Kotlin 一起工作。请重试。
    • 如果您使用自定义字体,这是可以接受的答案。向创作者致敬。
    【解决方案7】:

    很简单,只需像这样关闭指定的文本,例如&lt;b&gt;"your text here:"&lt;/b&gt;

    <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:

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

      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)
                                  

                                  【讨论】:

                                  • 谢谢,我想申请列表,你能更新答案吗?谢谢
                                  【解决方案28】:

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

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

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2023-02-15
                                    • 2018-10-15
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多