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

查看:12
本文介绍了在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 -

使用 textview 和要添加的文本调用 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天全站免登陆