2012年4月18日水曜日

TextViewでリンクを付けてみよう

開発中のアプリで、
「テキストの途中にリンクを入れて欲しいなー。ほら、htmlみたいに!」
といったことがありましたので、備忘録です。

TextView内でリンク処理を入れるには大まかに分けて3つのパターンがあります。

  1. Linkify.addLinksで行う
  2. TextViewの属性であるandroid:autoLinkを使う
  3. TextViewにhtmlの文字列を読み込ませる
こんな感じです。
で、最終的には3を使ったのですが、最初に1を使ってはまってしまいました。


1.Linkify.addLinksで行う


TextView textLink = (TextView)findViewById(R.id.textLink);
textLink.setText("頑張ってぐぐるよ!");
Pattern pattern = Pattern.compile("ぐぐる");
String scheme = "https://www.google.co.jp/";
Linkify.addLinks(textLink , pattern, scheme);

これだけです。
これで「ぐぐる」の部分にリンクが表示されます。
まあ、便利。
ただ、Linkifyはちょっとした問題があります。
それは「スキーマで指定したURLの後にパターンで指定した文字列がくっついて表示される」ということです。
これには地味にはまりました。
Applies a regex to the text of a TextView turning the matches into links. If links are found then UrlSpans are applied to the link text match areas, and the movement method for the text is changed to LinkMovementMethod.
と思いっきり「into links」ってあるやん!となってしまいまして、ふりだしに戻りました。

2.TextViewの属性であるandroid:autoLinkを使う

これはよくある方法です。
この中で定義されている「android:autolink」の属性で自動的に読み取ってリンク化してくれます。
とっても便利。
ちなみに設定できる値は下記の通りです。
  • web:リンクにURLを貼り、ブラウザを起動させる
  • email:メールアドレスにリンクを貼り、メーラーを起動させる
  • phone:電話番号にリンクを貼り、電話を起動させる
  • map:住所にリンクを貼り、マップを起動させる
  • all:上記全てにリンクを貼り、各リンクに合わせた挙動を行ってくれる
うん、とっても便利ですね。
でも、これだけですとhtmlのような文字リンクが実現できません。
そのため、最後にこの方法で実現させました。

3.TextViewにhtmlの文字列を読み込ませる

大雑把に言うとこんな感じですので、コードを載せます。

TextView textLink = (TextView)findViewById(R.id.textLink);
CharSequence charSequence = Html.fromHtml("がんばってぐぐるよ!");
MovementMethod mMethod = LinkMovementMethod.getInstance();
textLink.setMovementMethod(mMethod);
textLink.setText(charSequence);  

こんな感じで書いていきますと「ぐぐる」の箇所にリンクが貼れます。
最終的にはこれで行きまして、なんとかうまくいきました。
ただ、2で説明しました「android:autolink」属性をxmlに定義しますと、リンクが表示されなくなってかなりはまってしまいましたので注意してください。

ちょっと長くなりましたが、このようにして私は実装を行ってきました。
そのうちネタが集まったら改めて更新しようっと。

0 件のコメント:

コメントを投稿