在android中的textview中单击时获取链接文本的值 [英] Get the value of link text when clicked in a textview in android

查看:35
本文介绍了在android中的textview中单击时获取链接文本的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 TextView.我通过匹配一些正则表达式添加了诸如 "@abc""#android" 之类的自定义链接.链接显示正常.但是我没有办法提取被点击的链接的文本.我正在使用 SpannableString 将文本设置为文本视图.然后我使用我的自定义 ClickableSpan 设置跨度.它工作正常.另外,我还可以捕获 onclick 事件.但是 onClick() 方法有一个 View 参数.如果我在视图上调用 getText()(当然在将它的类型转换为 TextView 之后),它会返回整个文本.我搜索了很多,但总能找到添加链接和捕捉事件的方法,但没有人告诉我如何获取链接的文本.

I have a TextView. I have added custom links like "@abc", "#android" by matching some regex pattern. The links are displaying properly. However I am not getting a way to extract the text of the link which is clicked. I am using SpannableString to setText to the textview. I then set spans using my custom ClickableSpan. It works fine. Plus I can also catch the onclick event. But the onClick() method has a View paramter. If I call getText() on the View (ofcourse after typecasting it to TextView), it returns the entire text. I searched a lot but always found ways to add links and catch the event, but none told about getting the text of the link.

这是我用来添加链接和接收 onclick 的代码.我从其中一个 SO 线程中获得了代码..

This is the code I am using to add links and recieve onclick. I got the code from one of the SO threads..

Pattern pattern = Pattern.compile("@[\w]+");
Matcher matcher = pattern.matcher(tv.getText());//tv is my TextView
while (matcher.find()) {
    int x = matcher.start();
    int y = matcher.end();
    final android.text.SpannableString f = new android.text.SpannableString(
    tv.getText());
    f.setSpan(new InternalURLSpan(new View.OnClickListener() {
        public void onClick(View v) {
        showDialog(1);
    }
}), x, y, android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(f);
tv.setLinkTextColor(Color.rgb(19, 111, 154));
tv.setLinksClickable(true);

这是 InternalURLSpan:

Here is the InternalURLSpan:

class InternalURLSpan extends android.text.style.ClickableSpan {
    View.OnClickListener mListener;

    public InternalURLSpan(View.OnClickListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View widget) {
        mListener.onClick(widget);
        TextView tv = (TextView) widget;
        System.out.println("tv.gettext() :: " + tv.getText());
        Toast.makeText(MyActivity.this,tv.getText(),
        Toast.LENGTH_SHORT).show();
    }
}

是否可以点击链接的文本?如果没有,是否有办法将某些数据与特定链接相关联并知道点击了哪个链接?任何指针.

Is it possible to get the text of the link clicked? If not, is there a way of associating some data to a particular link and knowing which link gets clicked? Any pointers.

谢谢

推荐答案

解决方案是这样的 -

The solution goes like this -

用你的文本视图和要添加的文本调用 setLinks().

Call setLinks() with you textview and the text to be added.

setLinks(textView, text);

setLinks() 函数为 -

setLinks() function is as -

void setLinks(TextView tv, String text) {
        String[] linkPatterns = {
                "([Hh][tT][tT][pP][sS]?:\/\/[^ ,'">\]\)]*[^\. ,'">\]\)])",
                "#[\w]+", "@[\w]+" };
        for (String str : linkPatterns) {
            Pattern pattern = Pattern.compile(str);
            Matcher matcher = pattern.matcher(tv.getText());
            while (matcher.find()) {
                int x = matcher.start();
                int y = matcher.end();
                final android.text.SpannableString f = new android.text.SpannableString(
                        tv.getText());
                InternalURLSpan span = new InternalURLSpan();
                span.text = text.substring(x, y);
                f.setSpan(span, x, y,
                        android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(f);
                // tv.setOnLongClickListener(span.l);

            }
        }
        tv.setLinkTextColor(Color.BLUE);
        tv.setLinksClickable(true);
        tv.setMovementMethod(LinkMovementMethod.getInstance());
        tv.setFocusable(false);
    }

而 InternalURLSpan 类是这样的 -

and the InternalURLSpan class goes like this -

class InternalURLSpan extends android.text.style.ClickableSpan {
        public String text;

        @Override
        public void onClick(View widget) {
            handleLinkClicked(text);
        }

    }

handleLinkClicked() 为 -

handleLinkClicked() is as -

public void handleLinkClicked(String value) {
    if (value.startsWith("http")) {     // handle http links
    } else if (value.startsWith("@")) { // handle @links
    } else if (value.startsWith("#")) { // handle #links
    }
}

这篇关于在android中的textview中单击时获取链接文本的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆