2017-04-11 60 views
1
Android Studio 2.3.1 

我正在嘗試創建一些不是網頁或html的文本,而只是一些普通文本,我希望看起來像一個網頁鏈接,點擊時可以點擊。如何使textview文本鏈接可點擊

的文字是這樣的:Contains 3 reviews

我想使它看起來像一個可點擊的網頁鏈接。

private void setupTextViewAsLinkClickable() { 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
     mTvReviews.setMovementMethod(LinkMovementMethod.getInstance()); 
     mTvReviews.setText(Html.fromHtml("Contains 3 reviews", Html.FROM_HTML_MODE_LEGACY)); 
    } 
    else { 
     mTvReviews.setMovementMethod(LinkMovementMethod.getInstance()); 
     mTvReviews.setText(Html.fromHtml("Contains 3 reviews")); 
    } 
} 

我也試過這也爲我的xml:

 <TextView 
      android:id="@+id/tvReviews" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:fontFamily="sans-serif-condensed" 
      android:autoLink="all" 
      android:linksClickable="true" 
      android:clickable="true" 
      android:textSize="@dimen/runtime_textsize" 
      android:text="Contains 3 reviews" /> 

回答

2

你可以使用這個類來讓一個TextView看起來像網頁的URL,甚至點擊

public final class LinkUtils { 
    public static final Pattern URL_PATTERN = 
      Pattern.compile("((https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+))"); 

    public interface OnClickListener { 
     void onLinkClicked(final String link); 

     void onClicked(); 
    } 

    static class SensibleUrlSpan extends URLSpan { 
     /** 
     * Pattern to match. 
     */ 
     private Pattern mPattern; 

     public SensibleUrlSpan(String url, Pattern pattern) { 
      super(url); 
      mPattern = pattern; 
     } 

     public boolean onClickSpan(View widget) { 
      boolean matched = mPattern.matcher(getURL()).matches(); 
      if (matched) { 
       super.onClick(widget); 
      } 
      return matched; 
     } 
    } 

    static class SensibleLinkMovementMethod extends LinkMovementMethod { 

     private boolean mLinkClicked; 

     private String mClickedLink; 

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

      if (action == MotionEvent.ACTION_UP) { 
       mLinkClicked = false; 
       mClickedLink = null; 
       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); 

       ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); 

       if (link.length != 0) { 
        SensibleUrlSpan span = (SensibleUrlSpan) link[0]; 
        mLinkClicked = span.onClickSpan(widget); 
        mClickedLink = span.getURL(); 
        return mLinkClicked; 
       } 
      } 
      super.onTouchEvent(widget, buffer, event); 

      return false; 
     } 

     public boolean isLinkClicked() { 
      return mLinkClicked; 
     } 

     public String getClickedLink() { 
      return mClickedLink; 
     } 

    } 

    public static void autoLink(final TextView view, final OnClickListener listener) { 
     autoLink(view, listener, null); 
    } 

    public static void autoLink(final TextView view, final OnClickListener listener, 
           final String patternStr) { 
     String text = view.getText().toString(); 
     if (TextUtils.isEmpty(text)) { 
      return; 
     } 
     Spannable spannable = new SpannableString(text); 

     Pattern pattern; 
     if (TextUtils.isEmpty(patternStr)) { 
      pattern = URL_PATTERN; 
     } else { 
      pattern = Pattern.compile(patternStr); 
     } 
     Matcher matcher = pattern.matcher(text); 
     while (matcher.find()) { 
      SensibleUrlSpan urlSpan = new SensibleUrlSpan(matcher.group(1), pattern); 
      spannable.setSpan(urlSpan, matcher.start(1), matcher.end(1), 
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 
     view.setText(spannable, TextView.BufferType.SPANNABLE); 

     final SensibleLinkMovementMethod method = new SensibleLinkMovementMethod(); 
     view.setMovementMethod(method); 
     if (listener != null) { 
      view.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (method.isLinkClicked()) { 
         listener.onLinkClicked(method.getClickedLink()); 
        } else { 
         listener.onClicked(); 
        } 
       } 
      }); 
     } 
    } 
} 

而且在活動電話

String testStr = "Text 。http://www.yahoo.com , Text "; 

textView1.setTextSize(20); 
textView1.setText(testStr); 

LinkUtils.autoLink(textView1, new LinkUtils.OnClickListener() { 
    @Override 
    public void onLinkClicked(final String link) { 
        Log.i("Log", "Log"+link); 
    } 

    @Override 
    public void onClicked() { 
     Log.i("Log", "Log"); 
    } 
}); 
+0

我試圖第二個。文字看起來很正常。 – ant2009

+0

第二個顯示http://「+ url +」 – ant2009

+0

雖然你想點擊textview並執行操作,這將是解決方案,請讓我知道,如果這是你在找什麼 –

5
  • android:autoLink="web"如果您在HTML中有完整的鏈接,則適用。以下將被高亮藍,可點擊:
  • 一些文本<a href="http://www.google.com">http://www.google.com</a>
  • 一些文本http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance());將與以下工作(高亮顯示,可點擊):
  • 一些文本<a href="http://www.google.com">http://www.google.com</a>
  • 一些文本http://www.google.com
  • 一些文本<a href="http://www.google.com">Go to Google</a>

注意第三個選項有一個超鏈接,但鏈接的描述(之間的部分標籤)本身不是一個鏈接。 android:autoLink="web"確實不是與這樣的鏈接工作。

  • android:autoLink="web"如果XML設置將覆蓋view.setMovementMethod(LinkMovementMethod.getInstance());(第三類即;鏈接將被突出顯示,但不能點擊)。

這個故事的寓意是在代碼中使用view.setMovementMethod(LinkMovementMethod.getInstance());,並確保你沒有android:autoLink="web"在XML的佈局,如果你想所有鏈接點擊。