带有多个超链接的textview

时间:2013-03-11 05:17:05

标签: android hyperlink textview

我有以下字符串

  

\ n 3 Doors Down是来自Escatawpa的http://www.last.fm/tag/post-grunge \“class = \”bbcode_tag \“rel = \”tag \“> post-grunge乐队,密西西比州,美国,成立于1996年,由Brad Arnold(主唱),Matt Roberts(吉他),Todd Harrell(贝司),Chris Henderson(吉他)和Greg Upchurch(鼓)组成。乐队于2000年签约环球唱片公司他们的第一张专辑,http://www.last.fm/music/3+Doors+Down/The+Better+Life \“class = \”bbcode_album \“> The Better Life。随着单曲“http://www.last.fm/music/3+Doors+Down/_/Kryptonite \”class = \“bbcode_track \”> Kryptonite“的发行,他们受到了国际关注。专辑继续发行销售超过600万份。\ n \ n http://www.st.fm/music/3+Doors+Down\">在Last.fm上了解更多关于3门的信息。\ n \ n \ n用户 - 贡献文本可在Creative Commons By-SA许可下获得,也可以在GNU FDL下获得。\ n

我想在textview中显示整个字符串,并且可以点击超链接。我也不想看到实际的网址,只是显示代替网址的文字。阅读有关该主题的其他帖子,他们都建议定义类似于此

的文本视图
<TextView
            android:id="@+id/tvArtistOverview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:autoLink="web"
            android:linksClickable="true" />

并将textview的SetMovementMethod设置为

myTextView.setMovementMethod(LinkMovementMethod.getInstance());

当我按照这些步骤操作时,我的链接是可点击的,但是它们不会按我的意愿显示。我错过了什么?

以下是目前的示例。

nearly there

1 个答案:

答案 0 :(得分:0)

使用以下代码。

TextView tv = ....
tv.setMovementMethod(LinkMovementMethod.getInstance());

    String content = tv.getText().toString();
    List<String> links = new ArrayList<String>();

    Pattern p = Patterns.WEB_URL;
    Matcher m = p.matcher(content);
    while (m.find()) {
        String urlStr = m.group();
        links.add(urlStr);
    }

    SpannableString f = new SpannableString(content);

    for (int i = 0; i < links.size(); i++) {
        final String url = links.get(i);

        f.setSpan(new InternalURLSpan(new OnClickListener() {
            public void onClick(View v) {
                Context ctx = v.getContext();
                String urlToOpen = url;
                if (!urlToOpen.startsWith("http://") || !urlToOpen.startsWith("https://"))
                    urlToOpen = "http://" + urlToOpen;
                openURLInBrowser(urlToOpen, ctx);
            }
        }), content.indexOf(url), content.indexOf(url) + url.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    tv.setText(f);