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

时间:2010-07-13 01:53:27

标签: android coding-style textview

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

格式化示例:

截止日期
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 个答案:

答案 0 :(得分:3)

根据需要使用<b><i>标记标记您的字符串,然后使用Html.fromHtml(String)返回您要查找的Spannable。

答案 1 :(得分:2)

Html.fromHtml(String)带来了比轻量级SpannableString类更多的包袱。我建议您尽量避免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

答案 2 :(得分:0)

你可以用这个:

textview.setTypeface(null, Typeface.BOLD_ITALIC);

答案 3 :(得分:0)

您可以将Spannable设置为TextView的文字。这样,您可以先创建文本,在需要时添加样式信息,然后根据需要将其放入TextView

答案 4 :(得分:0)

您应该检查HTML类的工作方式。我会解析输入并动态生成spannable。

答案 5 :(得分:0)

我知道这个问题有些陈旧但是因为它是谷歌的顶级,我想把developer page作为一个很好的资源。底部包含帮助方法的建议,以便以编程方式设置文本样式。