Android
TextView
color

TextViewで文字の色を部分的に変える話

More than 1 year has passed since last update.

TextViewにはHTMLが使える

TextViewのtextには、一部のHTMLタグが使えるので、それを利用します。

strings.xml
<resources>
    <string name="sample_text">文字列の&lt;font color=\"#00BBEE\"&gt;ここだけ&lt;/font&gt;色を変える&lt;br&gt;改行もbrタグを使う必要があるので注意</string>
</resources>

このとき改行は、\nではなく、<br>で行う必要があるのですが、つい\nを使ってしまって、改行してねーというミスをやりがちなので注意しましょう。

コードで文字列を設定するとき

これをレイアウトリソースで使うときは、@string/sample_textで指定してやれば、そのまま使えるのですが、コード内で設定するときは一手間かかります。

    textView.setText(getString(R.string.sample_text));

これだと、TextViewはHTMLであると解釈してくれないので、

    textView.setText(Html.fromHtml(getString(R.string.sample_text)));

としてあげる必要があります。

動的に色を変える

getString()の第2引数移行を使って、文字列リソースに値を埋め込めるので、コードで色を変えたりすることもできます。

strings.xml
<resources>
    <string name="sample_text">文字列の&lt;font color=\"#%1$s\"&gt;ここだけ&lt;/font&gt;色を変える&lt;br&gt;改行もbrタグを使う必要があるので注意</string>
</resources>

文字列リソースの方では、fontタグのcolor属性の部分を%1$sとして値を埋め込むようにしておきます。

    String color = String.format("%08x", 出したい色);
    color = color.substring(2);
    textView.setText(Html.fromHtml(getString(R.string.sample_text, color));

コードで実際の色を埋め込んだ文字列を使用します。

Androidでは(Javaでは?)最上位の8bitをアルファ値として使用しているので、色の値を16進数の文字列にするとマットな色の場合、先頭にffがついて8文字になります。
HTMLとしては、アルファ値を含んだ色指定を想定していないので、先頭の2文字を切ってあげないとcolor属性が反映されません。ちょっとめんどくさいです。