1. ホーム
  2. android

[解決済み] Android TextView with Clickable Links: クリックをキャプチャする方法とは?

2022-05-14 05:44:30

質問

私は2つ以上のリンクを含む基本的なHTMLをレンダリングしているTextViewを持っています。私はリンク上のクリックをキャプチャし、リンクを開く必要があります - 私自身の内部WebViewで (デフォルトのブラウザではありません。)。

リンクレンダリングを処理する最も一般的な方法は、次のようなものです。

String str_links = "<a href='http://google.com'>Google</a><br /><a href='http://facebook.com'>Facebook</a>";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );

しかし、これによってリンクはデフォルトの内部ウェブブラウザで開くことになります ("Complete Action Using..." というダイアログが表示されます)。

リンクがクリックされたときに適切にトリガーされる onClickListener を実装してみましたが、どのリンクがクリックされたかを判断する方法がわかりません...。

text_view.setOnClickListener(new OnClickListener(){

    public void onClick(View v) {
        // what now...?
    }

});

あるいは、LinkMovementMethodのカスタムクラスを作成し、onTouchEventを実装してみましたが...。

public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
    String url = text.toString();
    // this doesn't work because the text is not necessarily a URL, or even a single link... 
    // eg, I don't know how to extract the clicked link from the greater paragraph of text
    return false;
}

アイデア?


解決例

私が思いついたのは 解決策 という、HTML 文字列からリンクを解析してクリック可能にし、その URL に応答できるようにするソリューションを開発しました。

どのように解決するのですか?

ベースとなるのは 別の回答 , HTML文字列からリンクを解析してクリック可能にし、URLに応答できるようにする関数setTextViewHTML()はこちらです。

protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            // Do something with span.getURL() to handle the link click...
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

protected void setTextViewHTML(TextView text, String html)
{
    CharSequence sequence = Html.fromHtml(html);
    SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
    URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);   
    for(URLSpan span : urls) {
        makeLinkClickable(strBuilder, span);
    }
    text.setText(strBuilder);
    text.setMovementMethod(LinkMovementMethod.getInstance());       
}