TextView的HTML格式化

5
我是一个有关TextView元素何时以格式化形式显示文本的规则有些困惑。
像这样的字符串
"There are <i>different ways</i> of coding.\n";

当我编写代码时,它显示为没有任何格式(包括HTML代码)的文本

tvMyTextView.setText("There are <i>different ways</i> of coding.\n");

但是当我把同样的字符串定义在strings.xml文件中,然后进行加载时

tvMyTextView.setText(R.strings.TestString);

它以加粗形式显示。

当我尝试在TextView中嵌入URL时,我感到更加困惑,就像这里:

"Click <a href="http://www.poon-world.com">here</a> to switch on the red light.\n";

毫无疑问,我已经尝试了TextView的各种属性选项 - 但除非我错过了什么,否则它们似乎没有太大的区别。在某些情况下,URL被编码在文本中,以蓝色显示并且可以被点击,在其他情况下,我可以看到HTML格式。在另一些情况下,它是颜色编码的,URL似乎以某种方式编码在文本中 - 但是当我单击它时什么也不会发生。关于嵌入URL,与使用“简单”HTML格式的其他示例不同,迄今为止我甚至找不到规则,即何时起作用,何时不起作用。有人能帮我理清思路吗..

尝试这个 <TextView android:linksClickable="true" <----- //其他属性 /> - MAC
3个回答

5

实际上,根据Android文档..

public final void setText (CharSequence text)

设置TextView的文本内容。 TextView不接受类似HTML的格式,这可以在XML资源文件中使用文本字符串来实现。要为字符串添加样式,请将android.text.style.*对象附加到SpannableString上,或者参见Available Resource Types文档中有关在XML资源文件中设置格式化文本的示例。
但是,
public final void setText (int resid)
  • 没有更多的具体规定..

但是根据Android资源字符串文档..

您可以使用HTML标记为字符串添加样式。例如:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome">Welcome to <b>Android</b>!</string>
</resources>

支持的HTML元素包括:

<b> for bold text.
<i> for italic text.
<u> for underline text.

有时您可能希望创建一个既用作格式字符串又被样式化的文本资源。通常,这是行不通的,因为String.format(String, Object...)方法会从字符串中剥离所有样式信息。解决此问题的方法是编写具有转义实体的HTML标签,然后在进行格式化后使用fromHtml(String)恢复它们。
至于您的URL字符串,...
tvMyTextView.setText(Html.fromHtml("Click <a href="http://www.poon-world.com">here</a> to switch on the red light.\n"));

请查看这个stackoverflow问题:如何在XML中从HTML格式化的字符串资源设置TextView文本
另外,请参阅Android字符串资源

3

0

在我的问题中添加一些注释并收到了迄今为止的答案后,我只能得出结论:似乎没有一种可靠的方法适用于所有情况。

根据我的经验,在某些情况下,如果格式化的URL是纯文本的一部分而不是被标签包围(例如http://www.poon-world.com,甚至只是“Poon-World.com”在大多数情况下都有效),仅设置TextView的属性似乎就足够了,链接将是可点击的。但是,如果链接嵌入HTML标记中,并且应该从某些链接文本中可点击,则似乎没有其他方法,只能使用Html.fromHtml(..)。

但也有一些特殊情况我无法解释:在某些活动/布局中,我正在使用“嵌入式”URL,并设置了前面提到的单击属性,不使用Html.fromHtml ..和惊喜!实际上在文本中创建的链接上单击确实会打开浏览器,但只有在代码中添加以下行到OnCreate事件后才会打开:

myTextView.setMovementMethod(LinkMovementMethod.getInstance());

(我在另一个帖子中发现了这个技巧,感谢作者)不知道为什么,似乎这是Android解析和评估字符串资源的方式。我只是提到了所有已经说过的东西,以便其他寻找解决方案并感到困惑的人不会开始认为他正在失去理智——不,只需在此页面上测试提到的方法,通常应该能够解决问题。


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