2013-01-05 9 views
17

Ho un TextView con un'altezza massima sconosciuta, che dipende dalla risoluzione dello schermo/DPI del dispositivo. Quindi, ad esempio, su e dispositivo MDPI questa altezza massima consente di mostrare solo 2 linee alla volta, un valore che può essere aumentato fino a un numero indefinito.Ellipize non funziona correttamente per un TextView multilinea con un'altezza massima arbitraria

Il mio problema è correlato alla funzionalità ellipsize. Supponiamo che un determinato dispositivo consenta la visualizzazione di 4 linee. Se imposto manualmente il numero massimo di righe, in questo modo ...

<TextView 
    android:id="@+id/some_id" 
    android:layout_width="fill_parent" 
    android:layout_height="0dip" 
    android:ellipsize="end" 
    android:maxLines="4" 
    android:singleLine="false" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:text="This is some really really really really really long text" 
    android:textSize="15sp" /> 

... tutto funziona correttamente. Se il testo non si adatta correttamente, quindi i puntini di sospensione vengono aggiunti alla fine della quarta linea, in questo modo:

This is some 
really really 
really really 
really long... 

ma preferirei non impostare il numero di linee come una variabile statica, come preferirei includere il supporto per qualsiasi combinazione di DPI/risoluzione dello schermo. Quindi se rimuovere maxLines i puntini di sospensione non viene più correttamente mostrato in linea a quattro, mostra invece una porzione incompleta di testo:

This is some 
really really 
really really 
really long 

Se leggermente aumentare la dimensione TextView, posso vedere che il resto del testo è ancora essendo disegnato "dietro" l'altro Views. Anche l'impostazione della variabile maxHeight non sembra funzionare.

Non riesco davvero a trovare una soluzione per questo problema. Qualche idea? Se aiuta, sto lavorando solo con Android v4.0.3 e versioni successive (livello API 15).

risposta

27

Calcolare quante linee si adattano allo TextView con TextView#getHeight() e TextView#getLineHeight(). Quindi chiama TextView#setMaxLines().

ViewTreeObserver observer = textView.getViewTreeObserver(); 
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int maxLines = (int) textView.getHeight() 
       /textView.getLineHeight(); 
     textView.setMaxLines(maxLines); 
     textView.getViewTreeObserver().removeGlobalOnLayoutListener(
       this); 
    } 
}); 
+0

Funziona perfettamente. Grazie mille! – DPR

+0

Divino! Ho salvato la mia giornata! – Roman

+2

Nota: l'altezza della linea può variare! E quindi il metodo getLineHeight non funzionerà sempre come previsto. Questo potrebbe accadere ad esempio quando si usano gli spannabili per rendere le dimensioni del carattere più grandi in una parte specifica del testo. –