有有的HREF和电话号码在一个TextView点击一个标准的方式? [英] Is there a standard way to have hrefs and telephone numbers clickable in a TextView?

查看:215
本文介绍了有有的HREF和电话号码在一个TextView点击一个标准的方式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经知道如何使用TextView的,当你有HTML,其和电话号码的HREFs自动创建的Web地址,电话号码等。我的问题是可点击的链接,你想都可以点击,有没有好还是做的更标准的方式吗?以下是我有:

I already know how to use TextView to automatically create clickable links for web addresses, phone numbers, etc.. My question is when you have HTML with hrefs in it as well as phone numbers and you want both clickable, is there a better or more standard way of doing it? Here is what I have:

String text = "Click <a href=\"http://stackoverflow.com\">Stackoverflow</a> or call 1-234-567-8901.";
TextView textView = getTextView();
textView.setLinksClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(Html.fromHtml(text));

// This is a pretty primitive US-centric phone number REGEX but it works
Linkify.addLinks(textView, Pattern.compile("(1?[-. ])?\\d\\d\\d([-. ])\\d\\d\\d\\2\\d\\d\\d\\d"), "tel:");

这code的作品,但似乎并不理想。我不叫setAutoLinkMask(Linkify.PHONE_NUMBERS),因为它会忽略在HTML中的href的,它会消灭Spannables的Html.fromHtml与创建Linkify.WEB_URLS甚至增加了。

This code works but doesn't seem ideal. I do NOT call setAutoLinkMask(Linkify.PHONE_NUMBERS) because it will ignore the href's in the HTML and it will wipe out the Spannables that Html.fromHtml adds even with Linkify.WEB_URLS created.

至少,我想使用更强大或标准的正则表达式的电话号码。我想是这样的 Patterns.PHONE 至少会一个更好的正则表达式。不过,我希望有一个更优雅的解决方案,我有什么上面。

At the very least I'd like to use a more robust or standard REGEX for the phone numbers. I'm thinking something like Patterns.PHONE would at least be a better regex. However, I would hope that there is a more elegant solution that what I have above.

推荐答案

您可以使用对自定义 LinkMovementMethod 的实施。像这样的:

You may use cutom LinkMovementMethod implementation. Like this:

public class CustomLinkMovementMethod extends LinkMovementMethod {

    private static CustomLinkMovementMethod linkMovementMethod = new BayerLinkMovementMethod();

    public boolean onTouchEvent(TextView widget, Spannable buffer,
            MotionEvent event) {
        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
            if (link.length != 0) {
                String url = link[0].getURL();
                if (url.startsWith("http://") || url.startsWith("https://")) {
                    //do anything you want 
                } else if (url.startsWith("tel:")) {
                    Intent intent = new Intent(Intent.ACTION_DIAL,
                            Uri.parse(url));
                    widget.getContext().startActivity(intent);
                    return true;
                } else if (url.startsWith("mailto:")) {
                    Intent intent = new Intent(Intent.ACTION_SENDTO,
                            Uri.parse(url));
                    widget.getContext().startActivity(intent);
                    return true;
                }
                return true;
            }
        }

        return super.onTouchEvent(widget, buffer, event);
    }

    public static MovementMethod getInstance() {
        return linkMovementMethod;
    }
}

这篇关于有有的HREF和电话号码在一个TextView点击一个标准的方式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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