2011-02-06 11 views
6

Ho del testo che verrà inserito in un TextView. L'ho fatto usando setText().Ottieni l'altezza di una TextView

Ora ho bisogno di trovare il numero di linee o altezza che occupa il testo nel TextView. Ho provato ad utilizzare getHeight(), ma restituisce sempre 0.

Esiste un modo per ottenere l'altezza del testo presente nel TextView?

+1

Non è possibile ottenere l'altezza di una vista finché non è stata sottoposta a rendering, ecco perché si ottiene sempre 0 restituiti se si controlla l'altezza subito dopo aver impostato il testo. Perché hai bisogno di conoscere l'altezza? Per favore spiega di più su cosa stai cercando di ottenere. –

+0

in realtà ho avuto modo di sviluppare un'applicazione che visualizza il testo e le immagini (proprio come un lettore di ebook) pagina per pagina (voglio dire che non dovrebbe contenere nessuna barra di scorrimento) ... quindi, quando ho una grande quantità di testo da inserire, ho bisogno di sapere quanto il testo sta occupando sullo schermo in modo che si adatti allo schermo .. –

risposta

6

Come John ha sottolineato, non si sarà in grado di ottenere l'altezza immediatamente dopo setText. Non sono sicuro che l'uso di getHeight() sul TextView stesso ti aiuterà molto. L'altezza della vista non dipende solo dall'altezza del testo visibile nella vista, ma anche dal viewgroup/layout in cui risiede TextView. Se il viewgroup dice a TextView di massimizzare l'altezza, getHeight() non ti porta da nessuna parte se si aspetta fino a dopo il rendering del testo.

vedo un certo numero di modi in cui questo potrebbe essere fatto:

  1. sottoclasse TextView e sovrascrivere il metodo onSizeChanged. Qui, chiama supers onSizeChanged, quindi ottieni il numero di linee all'interno di TextView di getLineCount() e l'altezza per riga con getLineHeight(). Questo potrebbe o potrebbe non essere migliore dell'uso di getHeight(), a seconda del layout o di quant'altro.
  2. Non utilizzare le dimensioni di Textview. Prendi TextViews Paint con TextView.getPaint(), quindi calcola la larghezza e l'altezza da

    Limiti; paint.getTextBounds (testo, 0, text.length(), limiti);

Ora avrete le dimensioni in limiti. Ora puoi lavorare con paint.breakText per vedere quanto testo si adatta a una riga. Probabilmente troppa seccatura e non è garantito (al mio occhio inesperto) la stessa logica usata da TextView.

+0

Kread ..puoi dare qualche esempio su come sottoclasse il TextView in modo che l'oggetto TextView presente nella classe principale possa essere usato nella sottoclasse –

+0

Bene, hai MyText di classe pubblica estende TextView {METODI OVERRIDE QUI} ​​e nella classe principale fai un " MyText textView = new MyText (this); " invece di "TextView textView = new TextView (this);". Se invece preferisci utilizzare i layout XML, ti consiglio di leggere http://developer.android.com/guide/topics/ui/custom-components.html (leggilo anche per creare roba in Java). –

+0

Thnks .. ma il metodo onSizeChanged viene chiamato alla fine !! quindi il getLineCount non può essere usato nel mezzo dell'applicazione! Voglio dire .. se voglio inizializzare una variabile con textview.getLineCount(), il valore della variabile è 0 fino alla fine anche dopo aver impostato il testo –

13

Poiché questa dimensione è nota solo al termine del layout, un modo è quello di creare una visualizzazione testo personalizzata e utilizzare il metodo onSizeChanged. Un altro modo è questo:

final TextView tv = (TextView) findViewById(R.id.myTextView); 
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Toast.makeText(MyActivity.this, tv.getWidth() + " x " + tv.getHeight(), Toast.LENGTH_LONG).show(); 
      tv.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    }); 

Questo codice che ho trovato qui: How to retrieve the dimensions of a view?

+0

Immagino di poter ottenere qualcosa di utile da questo .. thnq .. –

+0

Il prblema con il codice sopra è che .. l'altezza di la visualizzazione del testo può essere raggiunta solo alla fine del codice .. non riesco a metterlo nel mezzo !! Ho preso una variabile per memorizzare l'altezza e ho inizializzato la variabile con tv.getHeight() in onGlobalLayout() .. ma il valore della variabile è sempre 0 fino alla fine .. alla fine cambia in altezza del testo ... –

+0

Funziona ..grazie @Lumis – John