2011-08-29 57 views
7

Vấn đề là nếu tôi Linkify textView ScrollView underliyng không lắng nghe các cử chỉ quét Tôi đã setted.Is có một cách để có Linkify mà không rối tung với các cử chỉ của underliyng xem? Tôi cố gắng để ghi đè ontouchEvent và trả về false để ACTION_MOVE nhưng cử chỉ của scrollview cần ACTION_DOWN và ACTION_UP kiện để hoạt động. Có cách nào để đạt được điều đó không?Android TextView Linkify với cha mẹ Xem các cử chỉ

Trả lời

44

Linkify áp dụng cho một chuyển độngPhương pháp để xem văn bản LinkMovementMethod. Phương pháp chuyển động đó nghĩ rằng nó thực hiện một phương pháp cuộn theo chiều dọc nó ghi đè lên bất kỳ phương thức cuộn nào khác mà cha mẹ có. Mặc dù touchEvent có thể được dispached để phụ huynh, phụ huynh cụ thể ScrollView cần toàn bộ chuỗi ACTION_DOWN, ACTION_MOVE, ACTION_UP để thực hiện (quét phát hiện).

Vì vậy, giải pháp cho vấn đề của tôi là sau khi Linkify để loại bỏ phương pháp cuộn của textView và xử lý hành động phát hiện liên kết LinkMovementMethod trong onTouchEvent của textView.

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

Bằng cách này tôi có phát hiện Link_Click (chỉ thực hiện với người dùng chạm vào liên kết chứ không phải toàn bộ văn bản) và tôi không có toàn bộ LinkMovementMethod.

+1

Một triệu cảm ơn yous cho câu trả lời này. –

+0

Tôi rất vui vì cuối cùng đã giúp một người nào đó: D – weakwire

+0

bạn đời trả lời tuyệt vời! – Maurycy

0

Có một điều nhỏ xấu mà TextView :: setText (...) Phương pháp sử dụng Tự động liên kết cờ,

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()); 
      } 
     } 
    } 

Vì vậy, tôi đã dành một thời gian để hiểu , liên kết do tại sao tôi đang vô hiệu hóa trong ListView mục, nhưng công ty không giành một liên kết đôi!

Bạn cần phải thiết lập cờ đó về giá trị cần thiết và sau đó gọi một setText (...)

+0

Đó là một chút không rõ ràng những gì bạn đang nói ở đây. Đây có phải là câu trả lời cho câu hỏi hoặc bạn đang cố hỏi một câu hỏi mới? – SuperBiasedMan

+0

Đó chủ yếu là một lưu ý, vì tôi đã tìm thấy chủ đề này khi tìm kiếm "Linkify textview in ListView" – Mike

Các vấn đề liên quan