Android HtmlCompatを使ってテキストの一部文字スタイルを変更する

2019年8月29日

HTMLタグを使ってスタイル付きのテキストにしてみる。

おなじみのHTMLなので一部文字変更やURLリンクにする方法はとても分かりやすいが
エスケープ文字を使わないといけないので、ぱっと見みにくい。。

一部だけ文字スタイルを変更するなどはSpannableも利用できるが、今回は使用しない。

strings.xmlで装飾

res/values/strings.xml

    
        <p>太字<b> Android </b></p>
        <p>イタリック<i> Android </i></p>
        <p>アンダーライン<u> Android </u></p>
        <p>取り消し<del> Android </del></p>
        <p>リンク<a href="http://www.google.com"> Android </a> </p>
        <p>大きく<big> Android </big></p>
        <p>さらに大きく<big><big> Android </big></big></p>
        <p>小さく<small> Android </small></p>
        <p>文字色変更<font color="#11DDFF"> Android </font></p>
    

「Android」という文字列に対してイタリックにしたり、リンク付けたりしてる。

実際に記述するときはエスケープ処理する必要がある。
太字の例では以下のように記述する

<p>太字<b> Android </b></p>

「&lt;」は「<」の特殊文字でエスケープ処理しているのだが
まあ見にくい。ごちゃっとしてて嫌になる。
(これ以外の方法でうまくいくやり方見つけられず…)

 

HtmlCompatを使う

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    
    TextView tv = findViewById(R.id.tv_id);
    
    tv.setText(HtmlCompat.fromHtml(getString(R.string.html_create), HtmlCompat.FROM_HTML_MODE_COMPACT));
    tv.setMovementMethod(LinkMovementMethod.getInstance());
}

HtmlCompat.fromHtml(String source, int flags)
7行目にあるメソッドを利用し TextView に set するだけで
文字スタイルが違う複数行の文字列を表現することができる。

8行目にある TextView の設定は、リンクをタップできるようにしたもの。
tv.setMovementMethod(LinkMovementMethod.getInstance());

  

 

flagsの指定の違い

最初の例では
HtmlCompat.FROM_HTML_MODE_COMPACT
としたが、他にも複数flagがあり

HtmlCompat.FROM_HTML_MODE_LEGACY
とすると行間が空くようになる。

LEGACYだと行間空きすぎで、COMPACTは行間なさすぎ。
他のflagsでいい感じな行間を表現してくれるものは無いだろうか…

 

改行について

<p></p>で段落を表現していたが<br>で改行も可能である。
<br>を使う場合も「&lt;br>」としてエスケープする必要がある。

通常の文字列での改行は「¥n」を利用する

 

よく使いそうな特殊文字リンク

http://web-dou.com/html/t023.html

開発日記

Posted by konp