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

Android 如何在组装字符串时为TextView生成样式化文本?,android,coding-style,textview,Android,Coding Style,Textview,我有一个文本视图,它将保存一个样式化的多行字符串。该文本是逐行生成的,因为数据是从不同的源逐位绘制的。当我抓取每个字段时,我会在一个新行的TextView中添加一个粗体标题,然后在一个新行中添加该字段的斜体数据 格式示例: 截止日期 2010年7月22日 课程 CSC 350 我可以这样设置样式: Spannable str = (Spannable) textview.getText(); str.setSpan(new StyleSpan(android.graphics.Typeface

我有一个文本视图,它将保存一个样式化的多行字符串。该文本是逐行生成的,因为数据是从不同的源逐位绘制的。当我抓取每个字段时,我会在一个新行的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的数据字段数量可变


如何在添加每段文本时添加样式,而不是在添加所有文本后添加样式?

根据需要使用
标记您的字符串,然后使用返回您要查找的可扩展项。

您可以使用以下方法:

textview.setTypeface(null, Typeface.BOLD_ITALIC);

您可以将
Spannable
设置为
TextView
的文本。这样,您就可以先创建文本,在需要时添加样式信息,并将其适当地放入
文本视图中。

您应该检查类是如何完成的。我会分析输入并动态生成spannable。

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

Html。fromHtml(字符串)
比更轻的
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);
我一个接一个地设置文本和样式,但在实际使用中,这可以在循环中轻松完成。结果如下:


设置整个文本视图的样式,而不是文本的跨度。如果您是从资源中获取样式化字符串,则此其他答案将非常有用: