2013-03-22 12 views
14

Ho TextView con larghezza come wrap content. In questo TextView imposto il testo, ma il testo non ha la stessa lunghezza ogni volta. Quando il testo è molto lungo, utilizzo la singola riga true e ellipsize: end. Ma ora ho un problema. Voglio impostare Visibilità di un altro layout, ma ciò dipende dalla lunghezza del mio testo. Se il testo è troppo lungo per adattarsi allo schermo, desidero impostare trueVisible, ma quando il testo è breve e quando non ho bisogno di ellissi, voglio impostare false visibilità. Quindi ho bisogno di controllare lo stato del mio TextView. Quando il puntino ellittico si desidera setVisible true, quando non è setVisible false. Come posso farlo. Questo è quello che ho ottenuto:Verificare se la vista testuale è ellissata in Android

tvAle.post(new Runnable() { 

     @Override 
     public void run() { 

      int lineCount = tvAle.getLineCount(); 
      Paint paint = new Paint(); 
      paint.setTextSize(tvAle.getTextSize()); 
      final float size = paint.measureText(tvAle.getText().toString()); 
      Log.v("a", ""+size+" "+tvAle.getWidth()); 
      if ((int)size > (tvAle.getWidth()+10)) { 
       allergiesLayout.setVisibility(View.VISIBLE); 
      } 

      else 
       allergiesLayout.setVisibility(View.GONE); 

     } 

ma questa soluzione non funziona.

+0

codice postale. dire se ci sono errori. in modo che le persone capiscano meglio cosa vuoi chiedere e dove esattamente è il tuo problema. –

+0

Possibile duplicato di [Come faccio a sapere se la mia visualizzazione testuale è stata ellittica?] (Http://stackoverflow.com/questions/4005933/how-do-i-tell-if-my-textview-has-been-ellipsized) –

risposta

43

È possibile utilizzare questo metodo disponibile: getEllipsisCount

Layout layout = textview1.getLayout(); 
if(layout != null) { 
    int lines = layout.getLineCount(); 
    if(lines > 0) { 
     int ellipsisCount = layout.getEllipsisCount(lines-1); 
     if (ellipsisCount > 0) { 
      Log.d(TAG, "Text is ellipsized"); 
     } 
    } 
} 

dove la linea potrebbe essere ottenuta tramite getLineCount()

+0

Puoi mostrarmi qualche esempio con questo metodo? – user1302569

+0

Solo una chiamata al metodo sulla tua visualizzazione di testo. Codice aggiunto (non testato) – Calvin

+0

funziona benissimo, grazie – user1302569

1

Uso getEllipsisCount non funzionerà con testo con righe vuote all'interno di esso. Ho usato il seguente codice per farlo funzionare:

message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
     @Override 
     public boolean onPreDraw() { 

      if(m.isEllipsized == -1) { 
       Layout l = message.getLayout(); 
       if (message.getLineCount() > 5) { 
        m.isEllipsized = 1; 
        message.setMaxLines(5); 
        return false; 
       } else { 
        m.isEllipsized = 0; 
       } 
      } 
      return true; 
     } 
    }); 

Assicurarsi di non impostare un maxLineCount in XML. Quindi puoi verificare il lineCount nel tuo codice e se è maggiore di un certo numero, puoi restituire false per annullare il disegno di TextView e impostare il conteggio delle righe e un flag per salvare se textView è troppo lungo o non. Il textview disegnerà di nuovo con il conteggio delle linee corretto e saprai se è ellittizzato o meno con la bandiera.

È quindi possibile utilizzare il flag isEllipsized per fare tutto ciò che si richiede.

+0

Presumo che 'm.isEllipsized' è solo un flag impostato sulla classe che contiene il blocco di codice nel esempio – Muxa

8

Bene, la soluzione accettata funziona ma manca alcuni casi d'angolo perché controllerà solo l'ultima riga per i caratteri ellittici. Se abbiamo un TextView composto da due righe e utilizziamo TruncateAt.START per troncare il testo all'inizio, la risposta accettata fallirà. : -/

L'aggiunta di un ViewTreeObserver.OnPreDrawListener sembra più un sovraccarico molto costoso per me. Quindi ho apportato i seguenti miglioramenti al codice della risposta accettata:

/** 
* Checks if the text of the supplied {@link TextView} has been ellipsized. 
* 
* @param textView 
*   The {@link TextView} to check its text. 
* 
* @return {@code True} if the text of the supplied {@code textView} has been ellipsized. 
*/ 
public static boolean isTextViewEllipsized(final TextView textView) { 
    // Initialize the resulting variable 
    boolean result = false; 
    // Check if the supplied TextView is not null 
    if (textView != null) { 
     // Check if ellipsizing the text is enabled 
     final TextUtils.TruncateAt truncateAt = textView.getEllipsize(); 
     if (truncateAt != null && !TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) { 
      // Retrieve the layout in which the text is rendered 
      final Layout layout = textView.getLayout(); 
      if (layout != null) { 
       // Iterate all lines to search for ellipsized text 
       for (int index = 0; index < layout.getLineCount(); ++index) { 
        // Check if characters have been ellipsized away within this line of text 
        result = layout.getEllipsisCount(index) > 0; 
        // Stop looping if the ellipsis character has been found 
        if (result) { 
         break; 
        } 
       } 
      } 
     } 
    } 
    return result; 
} 

C'è ancora margine di miglioramento, tuttavia. Ma questo metodo è sufficiente per i miei casi d'uso. Correzioni e miglioramenti sono apprezzati. :-)