最初から入っているApiDemosアプリケーションにサンプルがあるので見てみましょう。
起動後、Text→Linkifyを見るとtext1からtext4まで4種類の方法でリンクが作成されています。
順番に見てみます。
まずtext1、レイアウトで自動設定。
/res/layout/link.xml
/res/values/strings.xml
android:autoLinkを指定すると、文字列中にURLっぽい文字列、電話番号っぽい文字列などがあれば自動的にリンクを張ってくれます。
もっとも簡単な方法と言えますが、<a href="http://www.google.com/">リンク</a>みたいなことはできません。
2番目がTextView.setMovementMethod()を利用する方法。
/ApiDemo/com.example.android.apis.test/Link.java
/res/layout/link.xml
/res/values/strings.xml
"
文字列として<a>タグを記述すると、その部分をブラウザへのリンクに変換してくれます。
TextView.setMovementMethod()は何をやってるかというと、リンクをクリックしたときにブラウザアクティビティを起動するというリスナーを自動追加しています。
昔OnItemClickListenerで実装していたようなことを一行で勝手にやってくれます。
ただandroid:autoLinkではそこらへんまで自動でやってくれたんだから、こっちでもやってくれればよかったのに。
なんか違うことをしたいときだけ上書きとかそんなかんじで。
3番目、アクティビティから文字列追加。
/ApiDemo/com.example.android.apis.test/Link.java
/res/layout/link.xml
単に2番目ではandroid:textで設定していたテキストをTextView.setText()で設定するようにしただけなのですが、この場合は何故かHtml.fromHtml()という謎メソッドを経由しなければなりません。
単純にt3.setText()だけだと、タグ部分もそのままテキスト表示されてしまいます。
android:textとTextView.setText()の動作は微妙に違うようです。
最後の手段は、テキストの任意箇所にSpannableString.setSpan()でスタイルをぺたぺた貼り付けていくという苦行な方法です。
/ApiDemo/com.example.android.apis.test/Link.java
/res/layout/link.xml
SpannableStringに文字列を突っ込み、1~6文字目をボールドに、14~17文字目を電話帳へのリンクにしています。
便利なのはSpannableString.setSpan()は入れ子も気にしないでいいということです。
1~14文字目をボールドに、6~17文字目を電話帳へのリンクにしたりなんてことも問題なく行うことができます。
ちなみにURLSpanはマルチバイト対応なので、日本語が入っていても気にせずカウント可能です。
#Typeface.BOLDは日本語に変化がなかったんだがこれはフォントの問題?根本的に非対応?
PR
起動後、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
1 | TextView text2 = (TextView) findViewById(R.id.autoLinkSample); |
2 | text2.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
1 | TextView t3 = (TextView) findViewById(R.id.text3); |
2 | t3.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." )); |
7 | t3.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
01 | SpannableString ss = new SpannableString( |
02 | "text4: Click here to dial the phone." ); |
03 |
04 | ss.setSpan( new StyleSpan(Typeface.BOLD), 0 , 6 , |
05 | Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
06 | ss.setSpan( new URLSpan( "tel:4155551212" ), 13 , 17 , |
07 | Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
08 |
09 | TextView t4 = (TextView) findViewById(R.id.text4); |
10 | t4.setText(ss); |
11 | t4.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は日本語に変化がなかったんだがこれはフォントの問題?根本的に非対応?
トラックバック
トラックバックURL: