【问题标题】:Is there a standard way to have hrefs and telephone numbers clickable in a TextView?是否有标准方法可以在 TextView 中单击 href 和电话号码?
【发布时间】:2015-01-27 21:40:03
【问题描述】:

我已经知道如何使用 TextView 自动为网址、电话号码等创建可点击的链接。我的问题是,当您的 HTML 中包含 href 以及电话号码并且您希望两者都可点击时,是否有更好或更标准的方法?这是我所拥有的:

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

此代码有效,但似乎并不理想。我不调用 setAutoLinkMask(Linkify.PHONE_NUMBERS) 因为它会忽略 HTML 中的 href 并且它会清除 Html.fromHtml 添加的 Spannables,即使创建了 Linkify.WEB_URLS。

至少我想为电话号码使用更强大或标准的 REGEX。我在想像Patterns.PHONE 这样的东西至少会是一个更好的正则表达式。但是,我希望有一个比我上面的更优雅的解决方案。

【问题讨论】:

    标签: android textview linkify linkmovementmethod


    【解决方案1】:

    您可以使用自定义LinkMovementMethod 实现。像这样:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 2013-01-23
    • 2012-08-30
    • 2013-03-22
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多