TextViewにリンクを付加する


以前本サイトの記事TextViewにWebサイトへのリンクを作成する にて、TextViewにリンクを貼る方法について解説しました。

上記記事では、TextViewにセットした文字列がURLだった場合にはURLに、メールアドレスだった場合にはメールアドレスに、それぞれ自動的にリンクへ変換する方法について解説しました。
今回は下図のように、文章中(TextView中)に出てくる特定の文字列に対してリンクを貼る方法について解説します。

ポイントはLinkifyクラスのaddLinksメソッドの使い方です。

それでは続きをどうぞ

URL、Emailアドレスをリンクにする

例えば以下のように、文中にURLとEmailアドレスが混在するケースを想定します。

“URL is https://techbooster.org and email is sample@gmail.com”

こういった場合、「https://techbooster.org」と 「sample@gmail.com」の2カ所のみ、それぞれリンクに変換したいものです。

このような場合は、 LinkifyクラスのaddLinksメソッドを利用して、以下のような方法で実現できます。

LinkfySampleActivity.java

        TextView text2 = (TextView)findViewById(R.id.linktext2);
        text2.setText("URL is https://techbooster.org and email is sample@gmail.com");
        Linkify.addLinks(text2, Linkify.ALL);

addLinksメソッドの第2引数にはフラグをセットしていますが、 Linkify.ALLは、指定したTextView中に登場するURLやEmailアドレスはすべてリンクにします。
その他にも、以下の表に示すフラグをそれぞれ第2引数に指定することで、URLのみ、またEmailアドレスのみ抽出してリンクにすることが可能です。
[table “204” not found /]

TextView中の特定の文字列をリンクにする

例えばブログなどでAndroidについて解説しているような場合に、「Android」という文字列はすべてリンクにして、公式サイトに飛べるようにするようなケースがあると思います。
LinkifyクラスのaddLinksメソッドを用いることで、それと同じことをTexiViewで実現できます。
下図では「Techbooster」の文字列をリンクにしています。

まずはソースコードを見てみます。

LinkfySampleActivity.java

        TextView text = (TextView)findViewById(R.id.linktext1);
        text.setText("TechboosterではAndroidを中心に技術解説しています。Techboosterはほぼ毎日更新しています。");
        Pattern pattern = Pattern.compile("Techbooster");
        final String strUrl = "https://techbooster.org/";

        Linkify.TransformFilter filter = new Linkify.TransformFilter() {
			@Override
			public String transformUrl(Matcher match, String url) {
				return strUrl;
			}
		};

        Linkify.addLinks(text, pattern, strUrl, null, filter);

3行目で、リンクにしたい文字列を指定します。
4行目で、リンクを押された場合に実行したいURLを定義しています。
6行目〜11行目で、 Linkify.TransformFilterクラスのインスタンスを生成しています。
12行目でLinkifyクラスのaddLinksメソッドを用いて、TextViewにリンクを作成しています。
各引数は以下の通りです。

[table “201” not found /]

第5引数のLinkify.TransformFilterクラスのインスタンスを指定することで、「Techbooster」と一致する文字列が見つかった際に、transformUrlメソッドの戻り値に指定した値に置き換えます。
もし以下のようにLinkify.TransformFilterクラスを指定しない場合、

LinkfySampleActivity.java

       TextView text = (TextView)findViewById(R.id.linktext1);
        text.setText("TechboosterではAndroidを中心に技術解説しています。Techboosterはほぼ毎日更新しています。");
        Pattern pattern = Pattern.compile("Techbooster");
        final String url = "https://techbooster.org/";

        Linkify.addLinks(text, pattern, url);

「Techbooster」をクリックすると、URLが「https://techbooster.org/Techbooster」となり、期待した結果となりません。

addLinksメソッドに対してLinkify.TransformFilterクラスのインスタンスを指定してやることで、「Techbooster」が「https://techbooster.org/」に置き換えられ、本サイト「Techbooster」がブラウザで開く結果となります。