2

TextViews で HTML とタイプされたリンクの両方を処理しようとしていますが、これを行うための組み込みツールの組み合わせを見つけることができません。どちらか一方を機能させることはできますが、両方を機能させることはできません。

次の形式が与えられた場合

http://google.com
<a href="http://google.com/">Google!</a>

.setMovementMethod(LinkMovementMethod.getInstance()) を使用すると、アンカー タグをリンクに変えて、クリックで Web ページを開くことができます。.setAutoLinkMask(Linkify.ALL) を使用すると、タイプされたリンクを期待どおりに機能させることができます。問題は、setAutoLinkMask が setMovementMethod 機能を無効にし、HTML リンク上で作成される強調表示とそのクリック機能を削除することです。

この問題を抱えている他のユーザーを検索してみましたが、この状況に関する適切な用語がないためにブロックされていると思います。両方のケースをシームレスに処理するソリューションに出くわした人はいますか?

これは私が現在持っているものです。タイプされたリンクのみが TextView にリンクされ、アンカーはラップするテキストを表示するだけです。

mTextViewBio.setText(Html.fromHtml(htmlstring));
mTextViewBio.setAutoLinkMask(Linkify.ALL);
mTextViewBio.setMovementMethod(LinkMovementMethod.getInstance());
mTextViewBio.setLinksClickable(true);

TextView 出力:

http://google.com
グーグル!

4

1 に答える 1

3

問題は、Linify.addLinks()このメソッドが最初に呼び出されたときに、すべてのスパンを削除することです。使用する場合Html.fromHtml() Spannedは return であるため、Linkifyテキストを再度解析するときは、最初に「html リンク」を削除します。私は単にクラスを書きましたLinkifyExtra。1つの追加のメソッドがあります

public class LinkifyExtra extends Linkify {
    public static Spanned addLinksHtmlAware(String htmlString) {
        // gather links from html
        Spanned spann = Html.fromHtml(htmlString);
        URLSpan[] old = spann.getSpans(0, spann.length(), URLSpan.class);
        List<Pair<Integer, Integer>> htmlLinks = new ArrayList<Pair<Integer, Integer>>();
        for (URLSpan span : old) {
            htmlLinks.add(new Pair<Integer, Integer>(spann.getSpanStart(span),
                    spann.getSpanEnd(span)));
        }
        // linkify spanned, html link will be lost
        Linkify.addLinks((Spannable) spann, Linkify.ALL);
        // add html links back
        for (int i = 0; i < old.length; i++) {
            ((Spannable) spann).setSpan(old[i], htmlLinks.get(i).first,
                    htmlLinks.get(i).second, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }

        return spann;
    }
}

そしてそれをそのように使う

    String htmlstring = "http://google.com <a href=\"http://google.com/\">Google!</a>";

    textView = (TextView)findViewById(R.id.textView1);

    textView.setText(LinkifyExtra.addLinksHtmlAware(htmlstring));
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setLinksClickable(true);

そして、それは機能します。ただし、「htmlリンク」をmTextViewBio.setAutoLinkMask(Linkify.ALL);トリガーして削除するため、使用できません。addLinks()全体像で何をしたいかによって異なりますが、この方法にはいくつかの変更が必要になる場合があります。スパンが重複しているかどうかのチェックはスキップします。これは起こり得ないと思うためですが、間違っている場合は、このメソッドをコピーするだけです。

于 2013-02-18T22:28:25.250 に答える