我在strings.xml中有一些固定的字符串,比如:

<resources>
    <string name="somestring">
        <B>Title</B><BR/>
        Content
    </string>
</resources>

在我的布局中,我有一个TextView,我想用html格式的字符串填充。

<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>

如果我这样做,formattedtext的内容只是一些字符串的内容剥离任何html标签,因此未格式化。

我知道可以用编程方式设置格式化文本

.setText(Html.fromHtml(somestring));

因为我在程序的其他部分使用了这个,在那里它是正常工作的。

要调用这个函数,我需要一个Activity,但目前我的布局只是一个简单的或多或少静态的纯XML视图,我宁愿让它这样,以节省我创建一个活动的开销,只是设置一些文本。

我是不是忽略了一些显而易见的东西?难道根本不可能吗?欢迎任何帮助或解决办法!

编辑:刚刚尝试了一些东西,似乎HTML格式在xml有一些限制:

标签必须小写 这里提到的一些标签不起作用,例如<br/>(可以使用\n代替)


当前回答

我有另一种情况,当我没有机会把CDATA放入xml,因为我从服务器接收字符串HTML。

以下是我从服务器上得到的信息:

<p>The quick brown&nbsp;<br />
fox jumps&nbsp;<br />
 over the lazy dog<br />
</p>

它看起来更复杂,但解决方法要简单得多。

private TextView textView;

protected void onCreate(Bundle savedInstanceState) { 
.....
textView = (TextView) findViewById(R.id.text); //need to define in your layout
String htmlFromServer = getHTMLContentFromAServer(); 
textView.setText(Html.fromHtml(htmlFromServer).toString());

}

希望能有所帮助! 灵

其他回答

因为上面的答案暗示了一些错误(或者至少太复杂了),我觉得这个问题应该更新,尽管这个问题相当老了:

当在Android中使用String资源时,你只需要从Java代码中调用getString(…)或在你的布局XML中使用Android:text="@string/…"

即使你想在你的字符串中使用HTML标记,你也不需要做很多改变:

在String资源中唯一需要转义的字符是:

双引号:“变成\” 单引号:“变成\” &号:&变成&#38;或者,

这意味着你可以添加你的HTML标记而不转义标签:

<string name="my_string"><b>Hello World!</b> This is an example.</string>

但是,为了确定,您应该只使用文档中列出的<b>, <i>和<u>。

如果你想使用你的HTML字符串从XML,只是继续使用android:text="@字符串/…",它会工作的很好。

唯一的区别是,如果您想从Java代码中使用HTML字符串,现在必须使用getText(…)而不是getString(…),因为前者保留了样式,而后者只会剥离它。

就这么简单。没有CDATA,没有Html.fromHtml(…)。

如果在HTML标记中编码特殊字符,则只需要使用HTML . fromhtml(…)。然后与getString(…)一起使用它。如果你想将String传递给String.format(…),这可能是必要的。

这些在文档中都有描述。

编辑:

getText(…)与未转义的HTML(如我所建议的)或CDATA部分与HTML . fromhtml(…)之间没有区别。

对比如下图所示:

如果你想显示html scrip在android应用程序像TextView

请遵循以下代码

科特林

var stringvalue = "Your Sting"

yourTextVew.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Html.fromHtml(stringvalue, Html.FROM_HTML_MODE_COMPACT)
        } else {
            Html.fromHtml(stringvalue)
        }

Java

String stringvalue = "Your String";

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                   yourTextVew.setText(Html.fromHtml(stringvalue, Html.FROM_HTML_MODE_COMPACT))
                } else {
                   yourTextVew.setText( Html.fromHtml(stringvalue))
                }
  String termsOfCondition="<font color=#cc0029>Terms of Use </font>";
  String commma="<font color=#000000>, </font>";
  String privacyPolicy="<font color=#cc0029>Privacy Policy </font>";
  Spanned text=Html.fromHtml("I am of legal age and I have read, understood, agreed and accepted the "+termsOfCondition+commma+privacyPolicy);
        secondCheckBox.setText(text);

转义你的HTML标签…

<resources>
    <string name="somestring">
        &lt;B&gt;Title&lt;/B&gt;&lt;BR/&gt;
        Content
    </string>
</resources>

最新更新:

Html.fromHtml(string);// Android N版本后不再使用

以下代码支持android N及以上版本…

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml(yourHtmlString,Html.FROM_HTML_MODE_LEGACY));
}

else 
{
textView.setText(Html.fromHtml(yourHtmlString));
}