使用Linkify查找和设置文本内的链接时,处理TextView链接的单击

时间:2013-11-27 12:04:10

标签: android textview linkify spannable urlspan

我有一个TextView,里面装满了我从服务器上获取的文本。我正在使用Linkify来处理所有链接搜索,并在其addLinks方法中需要设置URLSpan。

问题是单击链接时的默认行为是在浏览器中打开它,我想要的是获取点击的链接并自行处理。

我没有看到Linkify的任何方法让我设置“OnClick”或其他东西......

感谢您的帮助:)

3 个答案:

答案 0 :(得分:10)

好的,所以我终于设法将自己的“OnClickListener”设置为TextView的链接。 我的解决方案是将Linkify复制到我的项目中,将其命名为CustomLinkify,然后只需更改其applyLink方法:

自:

private static final void applyLink(String url, int start, int end, Spannable text) 
{
    URLSpan span = new URLSpan(url);

    text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

要:

private static final void applyLink(final String url, int start, int end, Spannable text) 
{
    URLSpan span = new URLSpan(url)
    {
        @Override
        public void onClick(View widget)
        {
            _onLinkClickListener.onLinkClicked(url);
        }
    };

    text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

其中_onLinkClickListener是新字段,由我在使用新CustomLinkify之前设置。

我知道它不是一个非常优雅的解决方案,我更喜欢谷歌允许通过原生Linkify设置一个监听器,但是,对我来说,这比实现我自己的Spannable逻辑更好(如其他相关问题所示) )。

我相信Linkify代码,我想我会不时检查是否有任何更改,如果有,我当然会更新CustomLinkify更改。

希望这会对某人有所帮助。

答案 1 :(得分:4)

我还发现在应用程序中实现自定义Spannable逻辑很繁琐,最终为此创建了一个库。请参阅Textoo

使用Textoo,可以实现:

TextView myTextView = Textoo
    .config((TextView) findViewById(R.id.my_text_view))
    .linkifyEmailAddresses()
    .linkifyMapAddresses()
    .linkifyPhoneNumbers()
    .linkifyWebUrls()  // or just .linkifyAll()
    .linkify(patternSettings, "internal://settings/")
    .linkify(patternGoogle, "http://www.google.ie/search2?q=", null, transformFilter)
    .linkify(patternGoogle, "http://www.google.ie/search3?q=", matchFilter, transformFilter)
    .addLinksHandler(new LinksHandler() {
        @Override
        public boolean onClick(View view, String url) {
            if ("internal://settings/location".equals(url)) {
                Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(locSettings);
                return true;
            } else {
                return false;
            }
        }
    })
    .apply();

分享并希望有人会发现它很有用。

答案 2 :(得分:-7)

也许您应该使用WebView而不是TextView?