7

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

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

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

感谢您的帮助 :)

4

3 回答 3

11

好的,所以我终于设法将我自己的“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更改。

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

于 2013-12-01T07:35:21.197 回答
6

我还发现在应用程序中实现自定义 Spannable 逻辑并最终为此创建一个库很乏味。请参阅文本

有了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();

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

于 2016-01-14T08:50:40.987 回答
-9

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

于 2013-11-27T12:11:40.350 回答