Android:添加“内部”链接到TextView的一部分,链接到我的代码中的操作

时间:2012-01-21 00:09:21

标签: android hyperlink textview

正如标题所解释的那样,我想添加指向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());

2 个答案:

答案 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());
        }