2013-01-17 13 views
16

Sto provando a determinare l'altezza di TextViewprima del che viene disegnato. Sto utilizzando il seguente codice per farlo:getMeasuredHeight() di TextView con testo inserito

TextView textView = (TextView) findViewById(R.id.textview); 
textView.setText("TEST"); 
int widthSpec = MeasureSpec.makeMeasureSpec(LayoutParams.MATCH_PARENT, MeasureSpec.EXACTLY); 
int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
textView.measure(widthSpec, heightSpec); 
System.out.println("MeasuredHeight: " + textView.getMeasuredHeight()); 

l'uscita è MeasuredHeight: 28. Niente di male in questo.

Tuttavia, quando mi danno l'una stringa di testo lungo TextView, così si verifica avvolgente, dà ancora l'altezza di una sola linea anziché due:

(...) 
textView.setText("TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST"); 
(...) 

L'uscita è MeasuredHeight: 28, dove mi aspetterei MeasuredHeight: 56 .

Perché non mi dà il giusto valore e come posso ottenere il giusto valore?

+0

Forse [questo] [1] vi aiuterà, è quasi lo stesso problema! [1]: http://stackoverflow.com/questions/6157652/android-getmeasuredheight-returns-wrong-values ​​ – ObAt

+0

Ho provato le soluzioni proposte in tale thread e in questo (http: // stackoverflow .com/questions/4668939/viewgrouptextview-getmeasuredheight-gives-wrong-value-is-smaller-than-real), ma hanno lo stesso risultato. – nhaarman

+0

Dove hai usato esattamente quel codice? – Luksprog

risposta

9

Questo è un metodo onCreate. L'intera gerarchia della vista non è ancora misurata e strutturata. Quindi il genitore di textView non sa che è largo. Questo è il motivo per cui le dimensioni di textView non sono limitate dalle dimensioni dei genitori.

tenta di modificare la linea:

int widthSpec = MeasureSpec.makeMeasureSpec(200, MeasureSpec.EXACTLY); 

quindi rendere il vostro larghezza TextView è uguale a 200 pixel.

Se spieghi perché hai bisogno dell'altezza del testo forse potremo aiutarti.

+0

Bene ora dà un'altezza> 28, ma ovviamente il 'TextView' non è largo 200px. – nhaarman

+1

Ho bisogno di conoscere l'altezza di 'TextView' per creare un'animazione espandente. In particolare, sto espandendo un 'ViewGroup' che contiene più componenti. Per l'animazione ho bisogno di conoscere l'altezza per animare. All'inizio, il 'ViewGroup' è' GONE', ho impostato l'altezza su '0', impostato la visibilità su' VISIBLE' e l'altezza gradualmente sull'altezza misurata. – nhaarman

+0

@Niek: conosci la larghezza disponibile per 'TextView'? Forse corrisponde alla larghezza della finestra? –

4

Sì, di recente mi sono imbattuto in questo. Il modo migliore è creare un oggetto ViewTreeObserver e registrare un ViewTreeObserver.OnGlobalLayoutListener. Questo sarà chiamato dopo la fase di layout e prima della fase di disegno. Sarai in grado di ottenere la dimensione della tua TextView a quel punto.

Questo non sarà strettamente il testo stesso, ma per l'intero TextView. Se è coinvolto il riempimento interno, il testo effettivo sarà più piccolo di TextView.

Se sono realmente necessarie le dimensioni del testo effettivo, utilizzare textView.getLayout() per ottenere l'oggetto Layout per il testo e quindi utilizzare layout.getHeight().

+0

Non riesco a utilizzare 'OnGlobalLayoutListener' per vari motivi.Per uno, ho bisogno di misurare l'altezza di un 'TextView' che ha visibilità' GONE' in un punto casuale nel tempo dopo che il resto del layout è stato disegnato. – nhaarman

0

È necessario creare personalizzato TextView e utilizzarlo nel vostro layout e utilizzare la funzione altezza getActual per impostare l'altezza in fase di esecuzione

public class TextViewHeightPlus extends TextView { 
    private static final String TAG = "TextViewHeightPlus"; 
    private int actualHeight=0; 


    public int getActualHeight() { 
     return actualHeight; 
    } 

    public TextViewHeightPlus(Context context) { 
     super(context); 
    } 

    public TextViewHeightPlus(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setCustomFont(context, attrs); 
    } 

    public TextViewHeightPlus(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     actualHeight=0; 

     actualHeight=(int) ((getLineCount()-1)*getTextSize()); 

    } 

} 
+0

Perché il "-1" è lì? –

Problemi correlati