Android没有规范来指示资源字符串的类型(例如text / plain或text / html)。但是,有一种解决方法可以使开发人员在XML文件中指定此方法。
- 定义一个自定义属性,以指定android:text属性为html。
- 使用子类化的TextView。
一旦定义了这些,就可以用xml文件中的HTML表达自己,而不必再次调用setText(Html.fromHtml(...))。我很惊讶这种方法不是API的一部分。
此解决方案在一定程度上可以使Android Studio模拟器将文本显示为呈现的HTML。
res / values / strings.xml(字符串资源为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();
}
}
}