2013-11-27 17 views
5

Ho un TexView che deve essere inserito in massimo 2 righe e ha un testo collegabile in esso. Se si imposta LinkMovementMethod sulla vista testo, viene visualizzato uno scorrimento TextView e l'ellisse viene ignorata.Effettuare ellipizzato un TextView che ha LinkMovementMethod

codice Xml:

<TextView 
      android:id="@+id/text_view" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="4dip" 
      android:clickable="true" 
      android:maxLines="2" 
      android:ellipsize="end" 

      android:scrollHorizontally="false" 
      android:scrollbars="horizontal" 
      android:isScrollContainer="false"/> 

Questa è la mia attività:

public class MyActivity extends Activity { 

    private TextView tv; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     tv = (TextView) findViewById(R.id.text_view); 

     SpannableStringBuilder captionSpan = new SpannableStringBuilder(); 
     captionSpan.append("a very long text here a very long text here a very long text here a very long text here a very long text here a very long text here a very long text here a very long text here"); 
     captionSpan.setSpan(new CustomClickableSpan(), 1, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

     tv.setText(captionSpan); 
     tv.setMovementMethod(LinkMovementMethod.getInstance()); 
    } 

} 


public class CustomClickableSpan extends android.text.style.ClickableSpan { 

    @Override 
    public void updateDrawState(TextPaint tp) { 
     tp.setColor(tp.linkColor); 
     tp.setUnderlineText(false); 
    } 

    @Override 
    public void onClick(View widget) { 
    } 

} 

Se non impostare il metodo di movimento di tutto sta funzionando benissimo.

risposta

4

Ho trovato la soluzione!
Invece setMovementMethod() utilizzare OnTouchListener.

String text = textView.getText().toString(); 
SpannableString spanText = new SpannableString(text); 

//here set your spans to spanText 

textView.setOnTouchListener(new TouchTextView(spanText)); 
textView.setText(spanText); 

ho ottenuto questo onTouchEvent() da LinkMovementMethod classe.

static class TouchTextView implements View.OnTouchListener { 
    Spannable spannable; 

    public TouchTextView (Spannable spannable){ 
     this.spannable = spannable; 
    } 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 
     if(!(v instanceof TextView)){ 
      return false; 
     } 
     TextView textView = (TextView) v; 
     if (action == MotionEvent.ACTION_UP || 
       action == MotionEvent.ACTION_DOWN) { 
      int x = (int) event.getX(); 
      int y = (int) event.getY(); 

      x -= textView.getTotalPaddingLeft(); 
      y -= textView.getTotalPaddingTop(); 

      x += textView.getScrollX(); 
      y += textView.getScrollY(); 

      Layout layout = textView.getLayout(); 
      int line = layout.getLineForVertical(y); 
      int off = layout.getOffsetForHorizontal(line, x); 

      ClickableSpan[] link = spannable.getSpans(off, off, ClickableSpan.class); 

      if (link.length != 0) { 
       if (action == MotionEvent.ACTION_UP) { 
        link[0].onClick(textView); 
       } else if (action == MotionEvent.ACTION_DOWN) { 
        Selection.setSelection(spannable, 
          spannable.getSpanStart(link[0]), 
          spannable.getSpanEnd(link[0])); 
       } 

       return true; 
      } else { 
       Selection.removeSelection(spannable); 
      } 
     } 

     return false; 
    } 
} 

E certo TextView dovrebbe avere questo attributi:

android:maxLines="2" 
android:ellipsize="end" 
+0

Ho seriamente non so come ringraziarvi abbastanza per questo !! Mi ha salvato! – Cbr

+0

Sono felice di aiutarti) – Airfreshener

+0

Finalmente capito .. Grazie mille ... –

Problemi correlati