我有一个 TextView 填充了我从服务器获取的文本。我正在使用Linkify处理所有链接搜索,并在其 addLinks 方法中需要的地方设置 URLSpan。
问题是单击链接时的默认行为是在浏览器中打开它,我想要的是获取单击的链接并自己处理它。
我没有看到任何让我设置“OnClick”或其他东西的 Linkify 方法......
感谢您的帮助 :)
好的,所以我终于设法将我自己的“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
更改。
希望这会对某人有所帮助。
我还发现在应用程序中实现自定义 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();
只是分享并希望有人会发现它有用。
也许您应该使用 WebView 而不是 TextView?