2013-07-01 99 views
0

我想創建一個ListView與鏈接在它的視圖中。就像Twitter應用程序一樣。 現在,這就是我在做什麼:我在TextView android:autoLink =「all」中設置。Selection.setSelection不能跨越

private static class TweetViewHolder { 
    public LinkifiedTextView text; 
    public TextView time; 
    public ImageView authorImage; 
} 

holder.text.setText(post.getTweet().getText()); 
Pattern pattern = Pattern.compile("@+[a-zA-Z_]+"); 
Linkify.addLinks(holder.text, pattern, "http://www.twitter.com/", null, myTransformFilter); 
pattern = Pattern.compile("#+[a-zA-Z_]+"); 
Linkify.addLinks(holder.text, pattern, "http://www.twitter.com/", null, myTransformFilter); 

TransformFilter myTransformFilter = new TransformFilter() { 
@Override 
public String transformUrl(Matcher match, String url) { 
return url.substring(1); //remove the $ sign 
} 
}; 

這是我的 「LinkifiedTextView」 代碼:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    TextView widget = (TextView) this; 
    Object text = widget.getText(); 
    if (text instanceof Spanned) { 
     Spannable buffer = (Spannable) text; 

     int action = event.getAction(); 

     if (action == MotionEvent.ACTION_UP 
       || action == MotionEvent.ACTION_DOWN) { 
      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) { 
       if (action == MotionEvent.ACTION_UP) { 
        link[0].onClick(widget); 
       } else if (action == MotionEvent.ACTION_DOWN) { 
        Selection.setSelection(buffer, 
          buffer.getSpanStart(link[0]), 
          buffer.getSpanEnd(link[0])); 

       } 
       return true; 
      } 
     } 

    } 

    return false; 

}

現在的代碼是在粉碎 「Spannable緩衝=(Spannable)文本;」 爲什麼是這樣的,我該如何改變一些東西才能使它工作? 謝謝!

回答

1

因爲並非所有Spanned都是Spannable。 Spannable是Spanned的一個子類,但不是唯一的一個。文本對象是其他一些子類。

+0

你有什麼想法我該如何糾正它? – roiberg

+0

生成行Spanned buffer =(Spanned)文本;而不是 –

+0

但它會粉碎Selection.setSelection(buffer, buffer.getSpanStart(link [0]), buffer.getSpanEnd(link [0])); – roiberg