忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


share

2025/04/08 21:06 |
Android2.2 テキストにリンクを張る
最初から入っているApiDemosアプリケーションにサンプルがあるので見てみましょう。
起動後、Text→Linkifyを見るとtext1からtext4まで4種類の方法でリンクが作成されています。
順番に見てみます。

まずtext1、レイアウトで自動設定。

/res/layout/link.xml
1<TextView android:id="@+id/text1"
2          android:layout_width="match_parent"
3          android:layout_height="match_parent"
4          android:autoLink="all"
5          android:text="@string/link_text_auto"
6          />

/res/values/strings.xml
1<string name="link_text_auto"><b>text1:</b> This is some text.  In
2  this text are some things that are actionable.  For instance,
3  you can click on http://www.google.com and it will launch the
4  web browser.  You can click on google.com too.  And, if you
5  click on (415) 555-1212 it should dial the phone.
6</string>

android:autoLinkを指定すると、文字列中にURLっぽい文字列、電話番号っぽい文字列などがあれば自動的にリンクを張ってくれます。
もっとも簡単な方法と言えますが、<a href="http://www.google.com/">リンク</a>みたいなことはできません。


2番目がTextView.setMovementMethod()を利用する方法。

/ApiDemo/com.example.android.apis.test/Link.java
1TextView text2 = (TextView) findViewById(R.id.autoLinkSample);
2text2.setMovementMethod(LinkMovementMethod.getInstance());

/res/layout/link.xml
1<TextView android:id="@+id/text2"
2          android:layout_width="match_parent"
3          android:layout_height="match_parent"
4          android:text="@string/link_text_manual"
5          />

/res/values/strings.xml
1<string name="link_text_manual"><b>text2:</b> This is some other
2  text, with a <a href="http://www.google.com">link</a> specified
3  via an <a> tag.  Use a \"tel:\" URL
4  to <a href="tel:4155551212">dial a phone number</a>.
5</string>

"

文字列として<a>タグを記述すると、その部分をブラウザへのリンクに変換してくれます。
TextView.setMovementMethod()は何をやってるかというと、リンクをクリックしたときにブラウザアクティビティを起動するというリスナーを自動追加しています。
昔OnItemClickListenerで実装していたようなことを一行で勝手にやってくれます。

ただandroid:autoLinkではそこらへんまで自動でやってくれたんだから、こっちでもやってくれればよかったのに。
なんか違うことをしたいときだけ上書きとかそんなかんじで。


3番目、アクティビティから文字列追加。

/ApiDemo/com.example.android.apis.test/Link.java
1TextView t3 = (TextView) findViewById(R.id.text3);
2t3.setText(
3    Html.fromHtml(
4        "<b>text3:</b>  Text with a " +
5        "<a href=\"http://www.google.com\">link</a> " +
6        "created in the Java source code using HTML."));
7t3.setMovementMethod(LinkMovementMethod.getInstance());

/res/layout/link.xml
1<TextView android:id="@+id/text3"
2          android:layout_width="match_parent"
3          android:layout_height="match_parent"
4          />

単に2番目ではandroid:textで設定していたテキストをTextView.setText()で設定するようにしただけなのですが、この場合は何故かHtml.fromHtml()という謎メソッドを経由しなければなりません。
単純にt3.setText()だけだと、タグ部分もそのままテキスト表示されてしまいます。
android:textとTextView.setText()の動作は微妙に違うようです。


最後の手段は、テキストの任意箇所にSpannableString.setSpan()でスタイルをぺたぺた貼り付けていくという苦行な方法です。

/ApiDemo/com.example.android.apis.test/Link.java
01SpannableString ss = new SpannableString(
02"text4: Click here to dial the phone.");
03 
04ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 6,
05           Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
06ss.setSpan(new URLSpan("tel:4155551212"), 13, 17,
07           Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
08 
09TextView t4 = (TextView) findViewById(R.id.text4);
10t4.setText(ss);
11t4.setMovementMethod(LinkMovementMethod.getInstance());

/res/layout/link.xml
1<TextView android:id="@+id/text4"
2          android:layout_width="match_parent"
3          android:layout_height="match_parent"
4          />

SpannableStringに文字列を突っ込み、1~6文字目をボールドに、14~17文字目を電話帳へのリンクにしています。
便利なのはSpannableString.setSpan()は入れ子も気にしないでいいということです。
1~14文字目をボールドに、6~17文字目を電話帳へのリンクにしたりなんてことも問題なく行うことができます。

ちなみにURLSpanはマルチバイト対応なので、日本語が入っていても気にせずカウント可能です。

#Typeface.BOLDは日本語に変化がなかったんだがこれはフォントの問題?根本的に非対応?

PR

share

2010/11/12 23:54 | Comments(0) | TrackBack() | Android

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<今週の実績 2010/11/14 | HOME | 買ったものリスト 2010/11/07>>
忍者ブログ[PR]