2013-06-04 15 views
16

In un frammento, sto gonfiando un layout con più viste figlio. Ho bisogno di ottenere le dimensioni (larghezza e altezza) di una di esse che è una vista personalizzata.getWidth() e getHeight() restituiscono sempre 0. Vista personalizzata

All'interno della classe di visualizzazione personalizzata posso farlo facilmente. Ma se provo a farlo dal frammento ottengo sempre 0 come dimensioni.

public void onViewCreated(View view, Bundle savedInstanceState) { 

    super.onViewCreated(view, savedInstanceState); 
    View culoide = view.findViewWithTag(DRAW_AREA_TAG); 
    Log.d("event", "culoide is: "+culoide.getWidth()); // always 0 
} 

Immagino che onViewCreated dovrebbe essere il posto giusto per ottenerlo, ma bene questo succede. Ho provato prima di super.onViewCreated, nel debug sembra che findViewWithTag trovi la vista giusta, provata solo con il supporto per api 7 v4.

Qualsiasi aiuto?

risposta

40

è necessario attendere fino a dopo la prima misura e il layout al fine di ottenere valori diversi da zero per getWidth() e getHeight(). Si può fare questo con un ViewTreeObserver.OnGlobalLayouListener

public void onViewCreated(final View view, Bundle saved) { 
    super.onViewCreated(view, saved); 
    view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 

      // get width and height of the view 
     } 
    }); 
} 
+0

+1 grazie :); removeGlobalOnLayoutListener è oggi già deprecato; ma questo è già un altro problema – quinestor

+0

Il metodo obsoleto chiama a quello nuovo (e in effetti non so se valesse la pena deprecare solo per il nome), ma ho comunque modificato il mio codice. – Karakuri

+0

Oppure sovrascrivere 'onSizeChanged()'. – Kerry

0

Prova a controllare in onWindowFocusChanged e dovrebbe avere valori validi:

public void onWindowFocusChanged (boolean hasFocus) { } 

ho avuto un problema simile in cui avevo bisogno di ottenere la larghezza e l'altezza di un widget e questa è stata la funzione in cui ho potuto garantire il widget segnalato che è la dimensione corretta.

1

provare a chiamare

culoide.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);

prima, quindi provare getWidth() e getHeight()

1

Dovete aspettare fino a quando il metodo onSizeChanged() viene chiamato prima di poter determinare in modo affidabile le dimensioni di visualizzazione.

Questo è chiamato durante il layout quando la dimensione di questa vista è cambiata. Se tu fossi appena aggiunto alla gerarchia di vista, siete chiamati con i vecchi valori di 0.

5

Il mio metodo preferito è quello di aggiungere un OnLayoutChangeListener alla vista che si desidera tenere traccia stessa

CustomView customView = ... 

customView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     // Make changes 
    } 
}); 

È possibile rimuovere l'ascoltatore nel callback se si desidera solo il layout iniziale.

Problemi correlati