AndroidのTextViewへHTMLマークアップによるスタイル設定(文字列装飾)を行う

Androidの記事が少なすぎるのでなんとかしてくれ、と言われたので3年振り(!?)に記事を書いてみます。 皆さんレイアウトリソース上のTextViewや汎用ダイアログクラスのメッセージ表示(AlertDialog.Builder.setMessageなど)で文字列の装飾を行いたくなることがあるかと思います。 そんな時に使えるのがHTMLマークアップによるスタイル設定(文字列装飾)です。 基礎的なことは上記公式サイトに説明が載っているのですが、詳細な仕様やまとめ的な情報があまり載っていません。 なので今回はそれらについて記事を書いてみたいと思います。 ※1つのTextViewで以下のような表示が可能になります。以下のサンプル画像の表示に使用したテキストは記事末尾に記載してあります。 文字列のスタイル設定についての基本事項 まず基本的な事項として、文字列のスタイル設定について軽く説明しておきます。 Spannable でスタイル設定をするに記載があるように、android.textパッケージ内のクラスを使用してスタイル設定を行うのが基本となります。 ImageSpanを使ってTextView内に画像を表示することも可能です。 2種類の文字列リソース取得方法 文字列に記載の通り、Contextクラスの getStringまたはgetTextメソッドによって文字列リソースの取得が行えます。 サンプルコードなどにあまり登場しないため、案外getTextは使ったことが無い方も多いのでは無いでしょうか。 getTextは説明にある通り、「文字列に適用されたリッチテキストのスタイルを保持」したオブジェクトを取得できます。 スタイルの設定に関しては後述するHTMLタグによって行います。 ソースコードを読むと分かりやすいのですが、getStringはgetText(resId).toString()を呼んでいるだけとなります。 TextViewへ文字列リソースのみでスタイル設定を行う そして今回の要となるTextViewへの設定の話となります。 みなさんも使用したことがあるかと思いますが、TextViewへソースコード上から文字列を設定する場合はsetText(CharSequence text)メソッドで行います。 このsetTextには引数としてCharSequenceを渡すことができ、ここに前述のContext.getTextで取得したスタイル設定されたCharSequenceを渡すことで、スタイルが反映された文字列がTextViewに表示されます。 また、XMLのレイアウトリソース上での text=”@string/xxx” による文字列指定やTextView.setText(int resid)を使用した場合はContext.getTextで取得した値をTextView.setText(CharSequence text)に設定したのと同じ状態になります。 一応TextView.setText(int resid)のソースコードを確認してみると、内部でResources.getText(Context.getText内部で使われているものと同じ)が使用されています。 Context.getTextによるスタイル設定(レイアウトリソース上のtext=”@string/xxx”指定も含む) HTML マークアップでスタイル設定をするのページを見ると「以下の HTML 要素をサポートしています。」という記述とともに以下の記載があります。 <b> テキストを太字にします。 <i> テキストを斜体にします。 <u> テキストにアンダーラインを引きます。 前述のとおり、文字列リソースのIDをそのままレイアウトリソース上などで使用するとContext.getTextで取得したCharSequenceを使用したのと同じ結果となります。 このContext.getTextによるスタイル設定なのですが、実は上記3種類以外のタグも使用することができます。 ただし、残念ながら公式には(おそらく)説明がありません。なのでソースコードを元に説明したいと思います。 細かい点は割愛いたしますが、Context.getTextのソースコードを辿っていくとStringBlockというクラスに辿り着きます。 この中のgetメソッド内でタグの解析などが行われています。ここを見る限り、<b> <i> <u>以外にも以下のタグが処理されているようです。 <tt> <big> 拡大率は1.25倍となっており、重ねがけができます。詳細はここ。 <small> 拡大率は0.8倍となっており、重ねがけができます。詳細はここ。 <sup> <sub> … Continue reading AndroidのTextViewへHTMLマークアップによるスタイル設定(文字列装飾)を行う