2011-08-29 62 views
7

問題是,如果我Linkify textView underliyng ScrollView不聽我設置的掃描手勢。是否有一種方法可以有Linkify而不會搞亂underliyng視圖的手勢? 我試圖覆蓋ontouchEvent並將錯誤返回到ACTION_MOVE,但滾動視圖的手勢需要ACTION_DOWN和ACTION_UP事件才能發揮作用。有沒有辦法實現這一點?Android TextView Linkify攔截與父視圖手勢

回答

44

Linkify適用於運動方式爲textView LinkMovementMethod。該移動方法認爲它實現了一種垂直滾動方法,它覆蓋了父級擁有的任何其他滾動方法。儘管touchEvent可以與父代分離,但是特定父代ScrollView需要整個序列ACTION_DOWN,ACTION_MOVE,ACTION_UP執行(掃描檢測)。

因此,我的問題的解決方案是在Linkify刪除textView的滾動方法並處理textView的onTouchEvent中的LinkMovementMethod鏈接檢測操作之後。

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

這樣,我有Link_Click檢測(僅與用戶進行觸摸的鏈接,而不是整個的TextView)和我沒有整LinkMovementMethod。

+1

百萬感謝你要跟這個答案。 –

+0

我很高興它終於幫助別人:D – weakwire

+0

偉大的答案隊友! – Maurycy

0

有利用自動鏈接標誌 的TextView ::的setText(...)方法的小壞事,

if (mAutoLinkMask != 0) { 
     Spannable s2; 

     if (type == BufferType.EDITABLE || text instanceof Spannable) { 
      s2 = (Spannable) text; 
     } else { 
      s2 = mSpannableFactory.newSpannable(text); 
     } 

     if (Linkify.addLinks(s2, mAutoLinkMask)) { 
      text = s2; 
      type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE; 

      /* 
      * We must go ahead and set the text before changing the 
      * movement method, because setMovementMethod() may call 
      * setText() again to try to upgrade the buffer type. 
      */ 
      mText = text; 

      // Do not change the movement method for text that support text selection as it 
      // would prevent an arbitrary cursor displacement. 
      if (mLinksClickable && !textCanBeSelected()) { 
       setMovementMethod(LinkMovementMethod.getInstance()); 
      } 
     } 
    } 

所以我花了時間去了解, 爲什麼我禁用鏈接ListView item, 但它有時會獲得鏈接!

您需要設置該標誌在需要的價值 然後再打一個的setText(...)

+0

這裏有點不清楚你在說什麼。這是問題的答案還是你想問一個新的問題? – SuperBiasedMan

+0

這主要是一個筆記,因爲我發現這個話題時,搜索「鏈接在ListView中的textview」問題 – Mike