正如标题所解释的那样,我想添加指向TextView
的链接,并注意以下两点:
我希望链接在TextView
的一部分上行动,而不是完整的部分(类似于HTML中的A
锚点)。
我希望链接指向代码中的操作,而不是网站。我可以在我的活动中定义一个方法,或者实现OnClickListener
,并在点击该特定链接时执行该方法。
到目前为止,我成功地将电话号码,地址,网站和电子邮件转换为专用外部链接:
Linkify.addLinks(message, Linkify.ALL);
我想要内部链接(对我的方法)类似的东西,可以定义自定义链接。
此外,使用带有内部链接和Web视图的网页实际上并不是一个选项,因为我已经定义了几个复杂的布局,并且必须修改整个应用程序和概念会非常痛苦...
有什么想法吗?
编辑: Kabuko给了我一个非常好的解决方案,这正是我实现它的方式:
final TextView descriptionTextView = (TextView) findViewById(R.id.description);
final Spannable span = Spannable.Factory.getInstance().newSpannable("the full text for the view");
span.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(StartEventActivity.this, "LINK CLICKED", Toast.LENGTH_SHORT).show();
}
}, 1, 20, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 1 and 20 to be replaced with actual index of start and end of the desired link
descriptionTextView.setText(span);
descriptionTextView.setMovementMethod(LinkMovementMethod.getInstance());
答案 0 :(得分:5)
如果您想真正转到网址,可以使用Html.fromHtml
,但如果您需要自己的点击处理程序,则可以使用ClickableSpan
。
答案 1 :(得分:0)
完成上一篇文章后,这可能对某人有所帮助
TextView textView = (TextView) getView().findViewById(R.id.textView);
textView.setText(Html.fromHtml(getString(R.string.html_)) , TextView.BufferType.SPANNABLE);
String tmp = ((Spannable) textView.getText()).toString();
String linkText = getString(R.string.html_link);
int index = tmp.indexOf(linkText);
if(index>=0) {
Spannable spannable = (Spannable) textView.getText() ;
spannable.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
try {
/// do what you must
}catch (Exception ex){
handleException(ex);
}
}
}, index, index+getString(R.string.html_link).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannable);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}