使用SpannableStringBuilder时,为什么我的文本没有样式显示?

7

我有一个 SpannableString 对象的问题。

下面是一个简短的示例:

SpannableString spanstr = new SpannableString("Bold please!");
spanstr.setSpan(new StyleSpan(Typeface.BOLD), 0, spanstr.length(), 0);

SpannableStringBuilder sb = new SpannableStringBuilder();
sb.append(spanstr);
sb.append("\n"); // A newline
sb.append("The first line is bold. This one isn't.");

CharSequence cq = sb.subSequence(0, sb.length());
// ^There's no such method to return a SpannableString,
// so I try to return a CharSequence instead.

// And then, at last:
TextView contentView = (TextView) findViewById(R.id.some_id);
contentView.setText(cq);

这个例子想要展示的是:

请加粗!
第一行应该是粗体,但实际上并不是。

问题在于:文本的第一行没有显示为粗体。

为什么没有按照预期显示呢?


contentView.setText(sb); - Raghunandan
我有同样的问题。你找到任何解决方案了吗?这不是很难的工作,但我还没有找到任何简单的解决方案。以上所有答案也都不起作用。 - Arda Kaplan
5个回答

20
使用可扩展字符串构建器,在TextView中设置为文本:
contentView.setText(sb);

否则你可以像这样做:

SpannableStringBuilder spanstr = new SpannableStringBuilder("Bold please!");
spanstr.setSpan(new StyleSpan(Typeface.BOLD), 0, spanstr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spanstr.append("\n");
spanstr.append("The first line is bold. This one isn't.");
contentView.setText(spanstr);

2
使用SpannableStringBuilder实例本身。
contentView.setText(sb);

您的代码输出结果如下:

enter image description here


非常感谢。我在spannableBuilder上调用了toString(),但不知道为什么看不到样式化的文本。 - Renat Kaitmazov
1
@RenatKaitmazov 不应该在 SpannableBuilder 上调用 toString() 方法,如果这样做,它会将其视为字符串,而不是带样式的文本。 - Pragnani

2
尝试以下方法。您需要将可跨度字符串设置为文本视图。因此,请按照以下方式将可跨度字符串设置为您的文本。
String s= "The first line is bold. This one isn't";
String title="Bold Please!";  
TextView tv = (TextView) findViewById(R.id.some_id);
tv.setText("");
SpannableString ss1=  new SpannableString(title);
ss1.setSpan(new StyleSpan(Typeface.BOLD), 0, ss1.length(), 0);
tv.append(ss1);
tv.append("\n");
tv.append(s);

我尝试了上述方法,您可以在下面看到结果快照。

输入图片说明


谢谢..它像魔法一样工作,正如我想要实现的那样 - KishuDroid

0

虽然回答有点晚,但是对于未来遇到这个问题的读者,

请确保在将构建器设置到文本视图中时不要调用toString()方法。

val builder = SpannableStringBuilder()
builder.setspan(xxxxxxx)

做这个:
textview.text = builder

不要这样做:

textview.text = builder.toString() //will remove the styling

唉,SpannableStringBuilder 的样式不起作用


0

如果您在设备上使用了自定义字体,可能会出现一个很傻的错误。请将您的自定义字体更改为默认字体,然后再试一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接