コンテンツ作成 > アプリ > 開発Tips

開発Tips


コンテンツ


概要

  • このページに記載されているすべてのソースコードはパブリックドメインとします
    • 内容は無保証です

Html.fromHtml()で使えるタグとその仕様

  • Html.fromHtml()はテキストをSpannedに変換できる便利なメソッドだが使えるタグについて説明がない
    • Android4.4.4のHtml.javaを読んでまとめた
タグ名 属性名 属性値 機能 種別 Span 備考
a href リンク先のパス ハイパーリンクにする インライン URLSpan クリック時の動作はURLSpanのデフォルト
big - - サイズを大きくする(基準の125%) インライン RelativeSizeSpan -
blockquote - - テキストを引用する ブロック QuoteSpan ブロックの左側に線が引かれる
br - - 改行する インライン - 強制的に改行('\n')を挿入
em, cite, dfn, i - - 斜体にする インライン StyleSpan Typeface.ITALICを使用
font color 色※1 or リソース※2 文字色を変更する インライン ForegroundColorSpan or TextAppearanceSpan 色の場合はForegroundColorSpan、リソースの場合はTextAppearanceSpanが使われる。
font face 書体名 書体を変更する インライン TypefaceSpan 属性値がそのままTypefaceSpanに渡される
h1 - - サイズを大きくする(基準の150%)&太字にする ブロック RelativeSizeSpan and StyleSpan Typeface.BOLDを使用
h2 - - サイズを大きくする(基準の140%)&太字にする ブロック RelativeSizeSpan and StyleSpan Typeface.BOLDを使用
h3 - - サイズを大きくする(基準の130%)&太字にする ブロック RelativeSizeSpan and StyleSpan Typeface.BOLDを使用
h4 - - サイズを大きくする(基準の120%)&太字にする ブロック RelativeSizeSpan and StyleSpan Typeface.BOLDを使用
h5 - - サイズを大きくする(基準の110%)&太字にする ブロック RelativeSizeSpan and StyleSpan Typeface.BOLDを使用
h6 - - サイズを大きくする(基準の100%)&太字にする ブロック RelativeSizeSpan and StyleSpan Typeface.BOLDを使用
img src 画像のパス 画像を表示する インライン ImageSpan Html.ImageGetterで画像のパスからDrawableを生成する処理を実装する必要あり。
画像が読み込めない場合はcom.android.internal.R.drawable.unknown_imageが表示される。
画像の表示可否に関わらずOBJECT REPLACEMENT CHARACTER(U+FFFC)が挿入される。
p, div - - 何もしないブロック要素 ブロック - 改行('\n')を挿入するのみ
small - - サイズを小さくする(基準の80%) インライン RelativeSizeSpan -
strong, b - - 太字にする インライン StyleSpan Typeface.BOLDを使用
sub - - 下付きにする インライン SubscriptSpan -
sup - - 上付きにする インライン SuperscriptSpan -
tt - - 等幅フォントにする インライン TypefaceSpan "monospace"を使用
u - - 下線を引く インライン UnderlineSpan -
上記以外 - - - - - Html.TagHandlerでハンドリング可能。上記以外のタグに限定されるため、
「新たにbgタグを作る」ことはできるが、「divタグにalign属性を追加する」ようなことはできない。
  • ※1 対応している色の表記は以下の通り
    • 以下の色名の場合はColor.getHtmlColor()によって色の値に変換される
      • black, darkgray, gray, lightgray, white, red, green, blue, yellow, cyan, magenta, aqua, fuchsia, darkgrey, grey, lightgrey, lime, maroon, navy, olive, purple, silver, teal
    • 上記以外の場合はXmlUtils.convertValueToInt()によって数値として色の値に変換される
      • 先頭が"0"の場合は8進数、"0x"または"#"の場合は16進数として数値に変換され、下位24ビットの0xRRGGBBが実際に色として使われる
  • ※2 色が"@"から始まっている場合はリソースとして扱われ、次の形式で組み込み色リソースを参照できる
    • android.R.color.darker_grayの場合は"@android:color/darker_gray"
  • 備考の備考
    • 古い端末ではemとstrongのスタイルが逆になっている
    • 背景色を設定するタグが存在しない
    • Html.toHtml()では対応していてHtml.fromHtml()では対応していないSpanが存在する
      • 例えばHtml.toHtml()は"<div align='center'>"のようなHTMLを出力できるがHtml.fromHtml()はalign属性に対応していない
      • そのためHTMLとSpanedを相互に変換することはできない
    • HTMLパーサを使ったり要素のたびにオブジェクトを作ったりしており汎用的ではあるが速度やメモリ効率は良くない
      • 修飾方法が決まっているのなら自前でSpannableStringやSpannableStringBuilderを使った方がいい

数値を三桁区切りの文字列に変換

// NumberFormatのインスタンスを取得
NumberFormat nf = NumberFormat.getInstance();

// s = "1,234,567,890"
String s = nf.format(1234567890);

数値を容量の文字列に変換

// 桁数を多めにする場合
// s1 = "1.15GB";
String s1 = Formatter.formatFileSize(this, 1234567890);

// 桁数を少なめにする場合
// s2 = "1.1GB";
String s2 = Formatter.formatShortFileSize(this, 1234567890);

Intent#putExtra()で配列を渡す

  • 配列はSerializableとして渡される
  • 取り出すときは(Object[])となる
    • 直接対象の型の配列にキャストすると例外が発生するので注意
    • 別途データ配列を生成して詰めなおす必要がある
  • 素直に受け渡し用クラスを使った方が楽かもしれない
// MyDataはSerializableなクラス

// これはできない
// MyData[] data = (MyData[])intent.getSerializableExtra("data");

// Object[]として取り出す
Object[] obj = (Object[])intent.getSerializableExtra("data");

// データの配列を生成する
MyData[] data = new MyData[obj.length];

// 配列に詰めなおす
for(int i=0; i<obj.length; i++)
{
  data[i] = (MyData)obj[i];
}

コメント

名前:
コメント: