2011-08-29 10 views
7

Problem polega na tym, że jeśli i Linkify tekstView underliyng ScrollView nie słuchaj gestów Sweep ustawiłem. Czy jest jakiś sposób na skorzystanie z Linuksfy bez zakłócania gestów podmenu? Próbowałem przesłonić ontouchEvent i zwrócić wartość false do ACTION_MOVE, ale gest przewijania musi działać w trybie ACTION_DOWN i ACTION_UP. Czy istnieje sposób, aby to osiągnąć?Android TextView Linkify przechwytuje z rodzica Zobacz gesty

Odpowiedz

44

Linkify dotyczy metody moveMethod do textView LinkMovementMethod. Ta metoda ruchu myślała, że ​​implementuje przewijaną metodę pionowo, która zastępuje każdą inną metodę przewijania, którą ma rodzic. Chociaż touchEvent może być przypisany do jednostki nadrzędnej, specyficzny rodzic ScrollView potrzebuje całej sekwencji do wykonania (wykrywanie zamiatania).

Tak więc rozwiązaniem mojego problemu jest po Linkiłach, aby usunąć metodę przewijania textView i obsłużyć akcję wykrywania łącza w z 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; 
    } 

ten sposób mam wykrywanie Link_Click (wykonywane tylko z użytkownikiem dotyka link i nie cała TextView) i nie mam całą LinkMovementMethod.

+1

Milion podziękowań dla tej odpowiedzi. –

+0

Cieszę się, że w końcu pomogło komuś: D – weakwire

+0

świetna odpowiedź kolego! – Maurycy

0

Jest mały złe, że metoda TextView :: setText (...) wykorzystując autoLink flagę,

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

Więc spędziłem czas, aby zrozumieć , dlaczego wyłączam linki w pozycji ListView item, , ale czasami uzyskuje się link!

Musisz ustawić tę flagę w potrzebnej wartości a następnie wezwać setText (...)

+0

To trochę niejasne, co tu mówisz. Czy jest to odpowiedź na pytanie, czy próbujesz zadać nowe pytanie? – SuperBiasedMan

+0

Jest to głównie uwaga, ponieważ znalazłem ten temat podczas wyszukiwania problemu "Linkify textview w ListView" – Mike