Androidには、リソース文字列のタイプ(例:text / plainまたはtext / html)を示す仕様はありません。ただし、開発者がXMLファイル内でこれを指定できる回避策があります。
- カスタム属性を定義して、android:text属性がhtmlであることを指定します。
- サブクラス化されたTextViewを使用します。
これらを定義すると、setText(Html.fromHtml(...))を再度呼び出す必要なく、xmlファイルでHTMLを表現できます。このアプローチがAPIの一部ではないことにかなり驚いています。
このソリューションは、Androidスタジオシミュレーターがレンダリングされた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();
}
}
}