2015-01-27 1 views
0

Я уже знаю, как использовать TextView для автоматического создания интерактивных ссылок для веб-адресов, телефонных номеров и т. Д. Мой вопрос в том, когда у вас есть HTML-код с hrefs, а также номера телефонов, и вы хотите, или более стандартный способ сделать это? Вот что у меня есть:Есть ли стандартный способ иметь hrefs и номера телефонов, которые можно щелкнуть в TextView?

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), потому что он будет игнорировать href в HTML, и он уничтожит Spannables, который Html.fromHtml добавит даже при создании Linkify.WEB_URLS.

По крайней мере, я хотел бы использовать более надежный или стандартный REGEX для телефонных номеров. Я думаю, что что-то вроде Patterns.PHONE, по крайней мере, будет лучшим регулярным выражением. Тем не менее, я надеюсь, что есть более элегантное решение, которое у меня было выше.

ответ

0

Вы можете использовать cutom 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; 
    } 
} 
+0

Этот подход предполагает, что Spannables находятся там правильно, в первую очередь, не так ли? –

+0

Ну все ссылки должны быть обернуты тегом . Я полагаю. Телефонные номера также. – Lingviston

+0

К сожалению, я не получу контент с уже завернутыми телефонными номерами. –

 Смежные вопросы

  • Нет связанных вопросов^_^