[Android Studio] Spannableを使用してテキストをマークアップする

どうも、tatsuです!

今日は、Spannableを使用してテキストをマークアップする方法を説明します。

※この記事で使用しているAndroid Studioのバージョンは2.3.3です。

Spannableを使用してテキストをマークアップする

Spannableインターフェースを使用することでテキストの一部のサイズを変更したり、下線を引いたりすることができます。
今回はEditTextを対象にしてプログラムを組んでみました!

MainActivity.java

MainActivity.javaは以下のようにします。

public class MainActivity extends AppCompatActivity {
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // EditTextに挿入する文字
        String insStr = "EditTextに表示されます。";
        /**
         * Spannableはファクトリーメソッドと呼ばれるメソッドを呼ぶことでインスタンスを取得することができます
         * 以下はおまじないだと思ってください
         */
        Spannable spannable = Spannable.Factory.getInstance().newSpannable(insStr);

        /**
         * Spannableインスタンスが取得できたのでsetSpanメソッドでマークアップします
         * 引数1:Spanクラスを指定(下線を引くクラス、文字を大きくするクラス等色々あります。今回はUnderlineSpanクラスを使用します。)
         * 引数2:開始位置
         * 引数3:開始位置から何文字か
         * 引数4:各Spanクラスの影響範囲を与えるフラグを指定(定数を指定するのですが、以下のやり方の方が簡単なのでソース内を参考にしてください)
         */
        UnderlineSpan underlineSpan = new UnderlineSpan();
        spannable.setSpan(
                underlineSpan,
                0,
                8,
                spannable.getSpanFlags(underlineSpan) // getSpanFlagsの引数に、引数1のインスタンスを指定してください
        );

        // これで"EditTextに表示されます。"の"EditText"の部分に下線が引かれます
        EditText editText = (EditText) findViewById(R.id.editText);
        editText.setText(spannable, TextView.BufferType.SPANNABLE);
    }
}

activity_main.xml

activity_main.xmlは以下のようにします。

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>

結果

補足
setSpanの引数1に指定できるインスタンスは以下のクラスのサブクラスです。

  • CharacterStyle
  • ParagraphStyle
  • TextWatcher
  • SpanWatcher

 
また、よく使いそうなSpanクラスを挙げます。

  • UnderlineSpan ⇒ 下線
  • ScaleXSpan ⇒ 横方向に縮小拡大(new時にfloat型で何倍かを指定します)
  • StyleSpan ⇒ 文字のスタイルを変更(new時に定数でboldやitalic等のスタイルを「Typeface.ITALIC」の様に指定します)

他にもたくさんあるので調べてみてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です