2016-09-24 1 views
0

Я установил clickable span на Textview, он делает TextView's скроллинг. Когда я касаюсь кликабеля Span, прокручивается TextView.Как предотвратить прокрутку текста после набора setMovementMethod для интерактивного диапазона?

Но я хочу только щелкнуть Textview с span, но не хочу scrollable textview.

Если у кого-то есть идея, пожалуйста, поделитесь этим.

textViewPostText.setMovementMethod(LinkMovementMethod.getInstance()); 
       ss.setSpan(clickableSpan, 0, s.length(), 0); 

textview и в xml

<TextView 
      android:id="@+id/textViewPostText" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/view1" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="10dp" 
      android:maxLines="2" 
      android:ellipsize="end" 
      android:text="" 
      android:textSize="15dp" /> 

ответ

0

Как LinkMovementMethod простирается от ScrollingMovementMethod, это довольно сложно отключить его прокрутки действия. Поэтому я решил написать обычную версию, которая простирается от BaseMovementMethod.

Все коды, указанные ниже, копируются из LinkMovementMethod#onTouchEvent(). Я добавляю только одну строку кода.

public class ClickOnlyMovementMethod extends BaseMovementMethod { 

    @Override 
    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { 
    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); 
      // Add this line of code for removing the selection effect 
      // when your finger moves away 
      Selection.removeSelection(buffer); 
     } else if (action == MotionEvent.ACTION_DOWN) { 
      Selection.setSelection(buffer, 
       buffer.getSpanStart(link[0]), 
      buffer.getSpanEnd(link[0])); 
     } 

     return true; 
     } else { 
     Selection.removeSelection(buffer); 
     } 
    } 
    return super.onTouchEvent(widget, buffer, event); 
    } 
} 
+0

Спасибо за материал .. working –