LoginSignup
5
6

More than 3 years have passed since last update.

【Kotlin】SpannableStringBuilderを使って、TextViewの一部をサイズ変更する

Last updated at Posted at 2019-08-13

下記のように数値の部分だけを大きくすることを考えてみます(数値はAPIから渡される仕様)。

そもそもSpanとは

スパンは、文字または段落レベルでテキストのスタイルを設定するために使用できる強力なマークアップオブジェクトです。テキストオブジェクトにスパンをアタッチすることにより、色の追加、テキストのクリック可能化、テキストサイズの拡大縮小、カスタマイズされた方法でのテキストの描画など、さまざまな方法でテキストを変更できます。

Spanの種類は20パターン以上あるようなので、詳細が気になる方は公式サイトをご覧ください。
Spans  |  Android Developers

コード

TextViewの拡張関数として実装する

fun TextView.changeSizeOfText(target: String, size: Int){

    // 対象となる文字列を引数に渡し、SpannableStringBuilderのインスタンスを生成
    val spannable = SpannableStringBuilder(target + "hPa")

    // Spanを組み込む
    spannable.setSpan(
        AbsoluteSizeSpan(size, true),
        0, // start
        target.length, // end
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    )

    // TextViewにSpannableStringBuilderをセット
    text = spannable
}

解説

肝となるのはsetSpan()で、

  • 第1引数:スタイルをどう変更するか
  • 第2引数:変更の開始位置
  • 第3引数:変更の終了位置
  • 第4引数:影響範囲

をそれぞれ指定します。中身を見に行くとこんな感じ↓

public void setSpan(Object what, int start, int end, int flags) 

第1引数で渡しているAbsoluteSizeSpan()は文字のサイズを絶対値で変化させる際に使うもので、第2引数diptrueを渡すと、デバイスに依存しないピクセルサイズを設定することができます。(dipdevice-independent pixelsの略)

第4引数の「影響範囲」については、基本的にSpanned.SPAN_EXCLUSIVE_EXCLUSIVEを渡しておけば大丈夫そうです(というか自分は他の定数を使ったことがないです…)。

呼び出す

MainActivity.kt
viewModel.pressure.value?.let { pressure -> //APIから渡される数値の文字列
    binding.textView.changeSizeOfText(pressure, 50)
}

これで無事TextViewの一部をサイズ変更することができました。

参考

5
6
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
5
6