1. ntsk

    Posted

    ntsk
Changes in title
+TextViewのリンク化いろいろ
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,72 @@
+# リンク化できるものを全てリンクにする
+XMLなら、
+
+```xml
+android:autoLink="all"
+```
+コード内で書くなら、
+
+```java
+
+textView.setAutoLinkMask(Linkify.ALL);
+```
+を指定することで、メールアドレス、URL、電話番号、住所(日本語非対応)をリンクにできる。```Linkify.EMAIL_ADDRESSES```や```Linkify.WEB_URLS```のようにして、メールアドレスやURLだけを個別に指定することも可能。
+https://developer.android.com/reference/android/widget/TextView.html#attr_android:autoLink
+
+# 特定のサイトのみリンク化する
+Linkify.MatchFilterを使ってパターンにマッチしたURLのみをリンク化する。以下はYoutubeのみを許可した例。
+
+```java
+Linkify.addLinks(textView, Patterns.WEB_URL, null, new Linkify.MatchFilter() {
+ @Override
+ public boolean acceptMatch(CharSequence charSequence, int start, int end) {
+ String url = charSequence.subSequence(start, end).toString();
+ Pattern pattern = Pattern.compile("^https?://((www\\.)?youtube\\.com|youtu\\.be)/");
+ Matcher matcher = pattern.matcher(url);
+ return matcher.find();
+ }
+ }, null);
+```
+
+
+# 特定のワードがあったらリンク化する
+Linkify.TransformFilterを使ってパターンにパッチしたワードをリンク化する。addLinksでスキームを指定すると先頭に追加してリンク化できる。以下は@付きのテキストがあったらTwitterリンクにする例。
+
+```java
+Pattern pattern = Pattern.compile("@([A-Za-z0-9_-]+)");
+String scheme = "http://twitter.com/";
+
+Linkify.addLinks(textView, pattern, scheme, null, new Linkify.TransformFilter() {
+ @Override
+ public String transformUrl(Matcher matcher, String s) {
+ return matcher.group(1);
+ }
+});
+```
+
+# aタグをリンク化する
+HTMLクラスのfromHtmlを使うことで、aタグをリンク化できる。クリックできるようにするには、LinkMovementMethodをセットする必要がある。
+https://developer.android.com/reference/android/text/Html.html
+
+```java
+textView.setText(Html.fromHtml("<a href=\"https://qiita.com/\">qiita</a>"));
+textView.setMovementMethod(LinkMovementMethod.getInstance());
+```
+※from.HtmlはAPIレベル24以上ではdeprecetedになっているので、ヘルパークラスなどを作ると良いよという記事があった。
+https://stackoverflow.com/questions/37904739/html-fromhtml-deprecated-in-android-n
+
+```java
+@SuppressWarnings("deprecation")
+public static Spanned fromHtml(String html){
+ Spanned spanned;
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
+ spanned = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
+ } else {
+ spanned = Html.fromHtml(html);
+ }
+ return spanned;
+}
+```
+
+# はまったこと
+Linkify.addLinksを設定した後にsetMaxLinesを指定するとリンク化が無効になってしまう。動的に行数を変化させているViewの場合には、setMaxLineの後にかけるなどの注意が必要。