LoginSignup
34
28

More than 5 years have passed since last update.

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

Posted at

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属性が反映されません。ちょっとめんどくさいです。

34
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
28