简体   繁体   中英

Is there a standard way to have hrefs and telephone numbers clickable in a TextView?

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:");

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.

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.

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;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM