代码之家  ›  专栏  ›  技术社区  ›  CodeFusionMobile

如何在组装字符串时为textview生成样式化文本?

  •  3
  • CodeFusionMobile  · 技术社区  · 14 年前

    我有一个文本视图,它将保存一个样式化的多行字符串。该文本是逐行生成的,因为数据是从不同的源逐位绘制的。当我抓取每个字段时,我在新行的textview中添加一个粗体标题,然后在新行中添加该字段的斜体数据。

    格式示例:

    到期日
    2010年7月22日
    课程
    CSC 350

    我可以这样设置样式:

    Spannable str = (Spannable) textview.getText();
    
    str.setSpan(new StyleSpan(android.graphics.Typeface.Bold), 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    str.setSpan(new StyleSpan(android.graphics.Typeface.Italic), 8, 21, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    str.setSpan(new StyleSpan(android.graphics.Typeface.Bold), 21, 27, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    str.setSpan(new StyleSpan(android.graphics.Typeface.Italic), 27, 33, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    

    但这需要知道运行时文本的每个部分的长度,因为可以将可变数量的数据字段添加到textView中,所以这是不可管理的。

    当我添加每一段文本而不是添加所有文本后,如何添加样式?

    6 回复  |  直到 8 年前
        1
  •  3
  •   jqpubliq    14 年前

    用记号标出你的绳子 <b> <i> 根据需要标记,然后使用 Html.fromHtml(String) 返回您正在寻找的可擦屁股。

        2
  •  2
  •   Suragch Shmidt    8 年前

    html.fromhtml(string) carries a lot more baggage with it than the more light weight spannableString classes.如果可能的话,我建议您避免使用 fromhtml to style a string.

    在您的案例中,您可以使用 spannableStringBuilder 构建字符串,然后使用最终样式化的字符串设置 textView text。

    设置文本 spannableString s1=新的spannableString(“到期日期\n”); spannableString s2=新的spannableString(“2010年7月22日\n”); spannableString s3=新的spannableString(“课程\n”); spannableString s4=新的spannableString(“csc 350\n”); //设置样式 s1.setspan(新样式span(typeface.bold),0,s1.length(),spand.span_exclusive_exclusive); s2.setspan(新样式span(typeface.italic),0,s2.length(),spand.span_exclusive_exclusive); s3.setspan(新样式span(typeface.bold),0,s3.length(),spand.span_exclusive_exclusive); s4.setspan(新样式span(typeface.italic),0,s4.length(),spanned.span_exclusive_exclusive); //生成字符串 spannableStringBuilder builder=新建spannableStringBuilder(); builder.append(s1); builder.append(s2); builder.append(s3); 建筑商。附加(S4); //使用样式化文本设置文本视图 textview.settext(生成器); < /代码>

    我一个接一个地设置文本和样式,但在实际使用中,这很容易在一个循环中完成。结果如下:

    我建议你避免 fromHtml 设置字符串样式。

    在您的示例中,可以使用 SpannableStringBuilder 然后设置 TextView 带有最终样式字符串的文本。

    // set the text
    SpannableString s1 = new SpannableString("Due Date\n");
    SpannableString s2 = new SpannableString("July 22, 2010\n");
    SpannableString s3 = new SpannableString("Course\n");
    SpannableString s4 = new SpannableString("CSC 350\n");
    
    // set the style
    s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    s3.setSpan(new StyleSpan(Typeface.BOLD), 0, s3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    s4.setSpan(new StyleSpan(Typeface.ITALIC), 0, s4.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
    // build the string
    SpannableStringBuilder builder = new SpannableStringBuilder();
    builder.append(s1);
    builder.append(s2);
    builder.append(s3);
    builder.append(s4);
    
    // set the text view with the styled text
    textView.setText(builder);
    

    我一个接一个地设置文本和样式,但在实际使用中,这很容易在一个循环中完成。结果如下:

    enter image description here

        3
  •  0
  •   Yogesh    14 年前

    您可以使用:

    textview.setTypeface(null, Typeface.BOLD_ITALIC);
    
        4
  •  0
  •   Paul de Vrieze    14 年前

    你可以设置一个 Spannable 作为 TextView . 这样,您可以先创建文本,在需要时添加样式信息,然后将其放入 文本框 适当时。

        5
  •  0
  •   charroch    13 年前

    你应该检查一下 HTML 上课吧。我将分析输入并动态地生成spannable。

        6
  •  0
  •   Eagle    10 年前

    我知道这个问题有点老套,但由于它是谷歌的头条,我想加入 developer page 作为一个很好的资源。底部包含帮助器方法的建议,以编程方式设置文本样式。