从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资源中转义的唯一字符是:
- 双引号:
"
变\"
- 单引号:
'
变成\'
- &符号:
&
变成&
或&
这意味着你可以添加你的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"> <B>Title</B><BR/> Content </string> </resources>
Android没有指定资源stringtypes的规范(例如text / plain或text / html)。 有一个解决方法,但是,这将允许开发人员在XML文件中指定。
- 定义一个自定义属性来指定android:text属性是html。
- 使用子类的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 <br /> fox jumps <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()); }
希望它有帮助!
灵