2015-01-27 9 views
0

나는 이미 TextView를 사용하여 웹 주소, 전화 번호 등의 클릭 가능한 링크를 자동으로 생성하는 방법을 알고있다. 내 질문은 전화 번호뿐만 아니라 href가 포함 된 HTML도 있고 클릭 가능을 원할 때 더 좋다는 것이다. 또는 그것을하기의 표준 방법? 다음은 내가 가지고있는 것입니다.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:"); 

이 코드는 작동하지만 이상적이지는 않습니다. 그것이 HTML의 href를 무시하고 Linkify.WEB_URLS가 생성 된 경우에도 Html.fromHtml이 추가하는 Spannables를 제거하기 때문에 setAutoLinkMask (Linkify.PHONE_NUMBERS)를 호출하지 않습니다.

적어도 나는 전화 번호에 대해보다 견고하거나 표준 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

불행히도 이미 포장 된 전화 번호로 콘텐츠를받지 못합니다. –