TextViewの一部の文字色を変更する

TextViewの文字列にHTMLタグが使えるのを知らなかったのでメモ。

今日も仕事で半分徹夜。そろそろ…

このように、文の一部分だけを赤色にしたいとする。ぱっと見全然難しいプログラムではなさそうだけど、実際にTextViewで実現しようとしたらちょっと迷った。

一番始めに思いついたのは、同色の文字毎にTextViewを作り横に並べれるという方法。1行に収まるならこれで良さそうだけど、複数行になる場合、自然な改行処理をするのがすごい面倒臭そうということで断念。 じゃあ、独自Viewを作ってdrawメソッド内にテキスト描画処理を組み込むか、と考えたけどこちらもむろんTextViewを使うだけの場合より相当面倒くさい。

こんな時に便利なのが、android.text.HtmlのfromHtmlメソッド。

HTMLタグを使えるので、以下のようにHTML文書を作成する感覚で手軽に文字修飾が出来てしまう。

textView.setText(Html.fromHtml(“今日も仕事で<font color=\”red\”> 半分徹夜</font>そろそろ…”));

さらに感動したのはbタグも使える事。 Androidの場合、機種によってはTextViewの日本語BOLD修飾が対応していない。 こういったケースの場合、いつもは苦肉の策としてPaintを使って文字淵を描いたり、TextViewのシャドウ機能を使って影を重ねて文字を太く見せたりしたけどHtml.fromHtmlを使えば、単純にbタグを使えばOKのよう。

これは非常に便利だ。 HTML5の時代にfontタグで文字修飾をするなんて相当なルール違反だろうけど、、まあ、TextViewはHTML文書ではないからいいよね?



TextViewのフォーカスを有効にする

androidのTextViewでフォーカスを有効にしようと思ったけど、うまく行かなかったのでメモ。

xmlで普通に↓「focusable」をtrueにすればいいだけかと思っていたらうまく行かなかった。

<TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="てきすと"
  android:focusable="true"
  />

↓のように「focusable」と「focusableInTouchMode」をtrueにするとうまく行った。

<TextView
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="てきすと"
  android:focusable="true"
  android:focusableInTouchMode="true"
  />

「focusableInTouchMode」はTouchモード時にViewがフォーカスを取得可能か設定するオプションとのこと。