我有一个TextView,里面装满了我从服务器上获取的文本。我正在使用Linkify来处理所有链接搜索,并在其addLinks方法中需要设置URLSpan。
问题是单击链接时的默认行为是在浏览器中打开它,我想要的是获取点击的链接并自行处理。
我没有看到Linkify的任何方法让我设置“OnClick”或其他东西......
感谢您的帮助:)
答案 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?