2010-07-30 16 views
5

Ho una TextView che visualizza il testo che cambia ed esegue il tempo. Voglio usare il metodo View.getLineCount() per vedere quante linee assume TextView e fare di conseguenza diverse funzioni. Il problema è che ho bisogno di determinare il numero di linee che TextView occupa nello stesso metodo che ha bisogno di sapere quante linee occupa. Ho provato a chiamare View.invalidate() tra le due chiamate ma non sembra che abbia risolto nulla. Vorrei misurare il numero di linee senza rendere la vista se possibile, ma se devo renderlo sarei aperto a farlo anche io. Fammi sapere se questo non è abbastanza specifico e cercherò di essere più specifico. Grazie!Android: Misura la dimensione della vista prima del rendering

risposta

1

Questo può effettivamente essere un problema molto complesso in Android. Se hai bisogno di sapere quando imposti il ​​testo (cioè prima che la vista sia renderizzata o prossima al rendering), l'unica opzione reale è usare StaticLayout. Se si può aspettare fino a quando nei pressi di tempo di rendering, è possibile utilizzare un viewTreeObserver:

yourTextView.getViewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout(){ 
     yourTextView.getLineCount(); 
    } 
} 

onGlobalLayout può essere chiamato più volte e, a volte (per qualsiasi motivo) ho trovato che le opinioni non sono effettivamente disposti ancora, quindi dovresti fare un po 'di registrazione e vedere se riesci a trovare un modo per assicurarti che qualunque risultato tu abbia effettivamente ha senso (cioè un conteggio delle righe> 0).

StaticLayouts è un'alternativa più complessa che dovrebbe essere in grado di fornire le dimensioni della visualizzazione e il numero di linee. Possono richiedere qualche ritocco per andare al lavoro correttamente, e assicurarsi di utilizzare la vernice dal punto di vista si sta cercando di misurare:

yourTextView.setText(newText); 
//the last boolean should be true if you're using padding on your view 
StaticLayout measure = new StaticLayout(yourTextView.getText(), yourTextView.getPaint(), 
    maxAvailableWidthForYourTextView, Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, false) 

int numberOfLines = measure.getLineCount(); 

Se siete disposti a (o hanno già) sottoclasse TextView, è può sovrascrivere onSizeChanged o onMeasure e provare a ottenere il numero di linee lì. Di nuovo, come con l'osservatore dell'albero delle viste, a volte possono essere chiamati prima che la vista sia stata effettivamente misurata, quindi potrebbe essere necessario verificare che qualsiasi valore ottenuto in questi metodi abbia senso.

Problemi correlati