从XML格式的string资源中设置TextView文本

我的strings.xml有一些固定的string,如下所示:

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

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

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

如果我这样做, formattedtext的内容只是somestring的内容剥离任何html标签,因此没有格式化。

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

.setText(Html.fromHtml(somestring));

因为我在我的程序的其他部分按照预期工作。

为了调用这个函数,我需要一个Activity ,但是目前我的布局只是一个简单的静态的简单的XML视图,我宁愿这样做,为了把我从创buildActivity的开销中解救出来,设置一些文本。

我可以忽略明显的东西吗? 这是不可能的吗? 任何帮助或解决方法欢迎!

编辑:只是尝试了一些事情,似乎在HTML中的HTML格式有一些限制:

  • 标签必须写成小写

  • 这里提到的一些标签不起作用,例如<br/>可以用\n代替)

以防万一有人发现这一点,有一个更好的select,没有logging(我search了几个小时后,绊倒了它,最后发现它在Android SDK本身的错误列表)。 你可以在strings.xml中包含原始的HTML,只要你把它包裹起来

 <![CDATA[ ...raw html... ]]> 

例:

 <string name="nice_html"> <![CDATA[ <p>This is a html-formatted string with <b>bold</b> and <i>italic</i> text</p> <p>This is another paragraph of the same string.</p> ]]> </string> 

然后,在你的代码中:

 TextView foo = (TextView)findViewById(R.id.foo); foo.setText(Html.fromHtml(getString(R.string.nice_html))); 

恕我直言,这是好几个数量级更好用:-)

因为这里最重要的答案是提示错误 (或至less太复杂),我觉得这应该更新,虽然这个问题是相当古老的:

在Android中使用String资源时,只需从Java代码中调用getString(...) ,或者在布局XML中使用android:text="@string/..."

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

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

  • 双引号: "\"
  • 单引号: '变成\'
  • &符号: &变成&#38;&amp;

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

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

但是,可以肯定的是,您应该只使用文档中列出的<b><i><u>

如果你想从XML使用你的HTMLstring,只要继续使用android:text="@string/..." ,它就可以正常工作。

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

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

如果您在HTML标记中编码了特殊字符,则只需要Html.fromHtml(...) 。 然后使用它与getString(...) 。 如果要将string传递给String.format(...)这可能是必需的。

这些都是在文档中描述的 。

编辑:

getText(...)与未转义的HTML(如我所build议的)或CDATA部分和Html.fromHtml(...)之间没有区别。

看下面的graphics进行比较:

在这里输入图像描述

转义您的HTML标签…

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

Android没有指定资源stringtypes的规范(例如text / plain或text / html)。 有一个解决方法,但是,这将允许开发人员在XML文件中指定。

  1. 定义一个自定义属性来指定android:text属性是html。
  2. 使用子类的TextView。

一旦你定义了这些,你可以用xml文件来expression你自己,而不必再次调用setText(Html.fromHtml(…))。 我很惊讶,这种方法不是API的一部分。

这个解决scheme的工作程度,Android演播室模拟器将显示文本呈现HTML。

在这里输入图像描述

res / values / strings.xml(string资源为HTML)

 <resources> <string name="app_name">TextViewEx</string> <string name="string_with_html"><![CDATA[ <em>Hello</em> <strong>World</strong>! ]]></string> </resources> 

layout.xml(只有相关部分)

声明自定义属性名称空间,并添加android_ex:isHtml属性。 也使用TextView的子类。

 <RelativeLayout ... xmlns:android_ex="http://schemas.android.com/apk/res-auto" ...> <tv.twelvetone.samples.textviewex.TextViewEx android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/string_with_html" android_ex:isHtml="true" /> </RelativeLayout> 

res / values / attrs.xml(定义子类的自定义属性)

  <resources> <declare-styleable name="TextViewEx"> <attr name="isHtml" format="boolean"/> <attr name="android:text" /> </declare-styleable> </resources> 

TextViewEx.java(TextView的子类)

  package tv.twelvetone.samples.textviewex; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.Nullable; import android.text.Html; import android.util.AttributeSet; import android.widget.TextView; public TextViewEx(Context context, @Nullable AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextViewEx, 0, 0); try { boolean isHtml = a.getBoolean(R.styleable.TextViewEx_isHtml, false); if (isHtml) { String text = a.getString(R.styleable.TextViewEx_android_text); if (text != null) { setText(Html.fromHtml(text)); } } } catch (Exception e) { e.printStackTrace(); } finally { a.recycle(); } } } 

最新更新:

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)); } 

当我从服务器收到stringHTML时,我没有机会将CDATA放入xml中。

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

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

这似乎更复杂,但解决scheme要简单得多。

 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()); } 

希望它有帮助!