XML 内の HTML 形式の文字列リソースから TextView テキストを設定する 質問する

XML 内の HTML 形式の文字列リソースから TextView テキストを設定する 質問する

strings.xml私の の中には、次のような固定文字列がいくつかあります。

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

レイアウトには、TextViewHTML 形式の文字列を入力したい があります。

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

これを実行すると、 のコンテンツはHTML タグが削除されたformattedtextだけの のコンテンツとなり、フォーマットされません。somestring

プログラムで書式設定されたテキストを設定することは可能です。

.setText(Html.fromHtml(somestring));

これは、プログラムの他の部分で使用しており、期待どおりに動作しているからです。

この関数を呼び出すには が必要ですActivityが、現時点ではレイアウトは単純な XML の静的なビューに過ぎないので、Activityテキストを設定するためだけに を作成するオーバーヘッドを回避するために、そのままにしておくことをお勧めします。

何か明らかなことを見落としているのでしょうか? まったく不可能なのでしょうか? 助言や回避策があれば歓迎します!

編集: いくつか試してみたところ、xml での HTML フォーマットにはいくつかの制約があるようです。

  • タグは小文字で書く必要があります

  • 言及されているいくつかのタグここ動作しません。例: <br/>(代わりに使用することは可能です\n)

ベストアンサー1

万が一誰かがこれを見つけた場合に備えて、文書化されていないよりよい代替案があります(私は何時間も検索した後、Android SDK自体のバグリストでようやく見つけました)。できるstrings.xmlに生のHTMLを含める場合は、

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

エッジケース:

  • アポストロフィ (')、二重引用符 (")、アンパサンド (&) などの文字は、レンダリングされたテキストにそのまま表示したい場合にのみエスケープする必要がありますが、HTML として解釈される可能性もあります。
    • 'およびは、 および 、またはおよび"として表すことができます。\'\"&apos;&quot;
    • <そして> いつもテキスト内で文字通り「<」と「>」としてレンダリングしたい場合は、&lt;エスケープする必要があります。&gt;
    • アンパサンド (&) は少し複雑です。
      • アンパサンドの後に空白が続くと、アンパサンドとして表示されます。
      • アンパサンドの後に有効な HTML エンティティ コードを形成しない 1 つ以上の文字が続く場合は、アンパサンドの後にそれらの文字が続く としてレンダリングされます。つまり、&qqq;は としてレンダリングされます&qqq;が、&lt;1は としてレンダリングされます<1

例:

<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 from the same \'string\'.</p>
<p>To be clear, 0 &lt; 1, & 10 &gt; 1<p>
]]>
</string>

次に、コード内で次の操作を行います。

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

私見ですが、これは作業が桁違いに楽です :-)


2021年8月の更新:私の最初の回答ではHtml.fromHtml(String)を使用していましたが、これはAPI 24で非推奨になりました。代替案HTMLから(文字列、int)代替としてフォームが提案されます。

FROM_HTML_MODE_LEGACY はおそらく機能するでしょう...しかし、他のフラグのいずれかが、あなたがやりたいことに対してより良い選択であるかもしれません。

最後に、AndroidのSpannedテキストをTextViewで使用できるようにレンダリングしたい場合は、マークダウンHTMLの代わりに構文を使用するため、複数のサードパーティライブラリがあり、簡単に使用できます。https://noties.io/Markwon

おすすめ記事