2014-06-26 13 views
11

Dopo aver misurato una View con dimensioni costanti con view.measure(), il getMeasuredHeight() e getMeasureWidth() sta tornando 0.getmeasuredheight() e getmeasuredwidth() restituisce 0. View.measure()

layout_view.xml, disposizione che viene gonfiato per creare la vista

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="100dp" 
    android:layout_height="100dp"> 
</FrameLayout> 

funzione che misura le dimensioni

public void measureView(Context context){ 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.layout_view,null,false); 

    view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 

    Log.d(TAG,"Error width : " + view.getMeasuredWidth()); 
    Log.d(TAG,"Error heeght : " + view.getMeasuredHeight()); 

} 
+0

vedere questo http: // stackoverflow.it/questions/14592930/getwidth-returns-0-if-set-by-androidlayout-width-match-parent –

+0

@GiruBhai Ho provato a utilizzare ViewTreeObserver, anche questo non funziona – SathMK

+0

'View.MeasureSpec. *' non può essere utilizzato direttamente, controlla la mia risposta qui sotto. –

risposta

3

Prova in questo modo, spero che questo ti aiuterà a risolvere il tuo problema.

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
    int width = view.getMeasuredWidth(); 
    int height = view.getMeasuredHeight(); 

    } 
}); 
+0

no, che sta anche restituendo 0 – SathMK

4

stai misurando la visualizzazione in onCreate(). La vista non è ancora disegnata. Devi aspettare fino a quando la vista non viene disegnata prima di poterla misurare.

La soluzione semplice per questo è postare un eseguibile per il layout. Il runnable sarà eseguito dopo che il layout è avvenuto.

Per maggiori informazioni See this post

Modifica tenta di modificare

view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 

a

view.measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY); 
+0

sto misurando la vista nel metodo onclick. Per evitare il problema che hai rilevato, sto misurando esplicitamente la vista con 'view.measure()' – SathMK

+0

@SathMK prova la mia risposta modificata. –

+0

ho provato questo può anche, ma ancora il risultato è zero – SathMK

0

se la vista è misurata visibilità impostato andato, misurazione tornerà 0. È puoi impostarlo su visibile, misurare e poi tornare indietro, tutto dal codice.

+0

è impostato per default – SathMK

7

Quando si chiama view.getMeasuredWidth() in onCreate() o onCreateView(), il view non è stato ancora disegnato. Quindi è necessario aggiungere un listener e ricevere una richiamata quando viene disegnato lo view. Proprio come questo nel mio codice:

ViewTreeObserver vto = view.getViewTreeObserver(); 
if (vto.isAlive()) { 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int viewWidth = view.getMeasuredWidth(); 
      // handle viewWidth here... 

      if (Build.VERSION.SDK_INT < 16) { 
       v.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } else { 
       v.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     } 
    }); 
} 

NOTA: Rimuovere l'ascoltatore per migliorare le prestazioni!

Non chiamare vto.removeOnGlobalLayoutListener(this) per rimuovere l'ascoltatore. Chiamalo in questo modo:

v.getViewTreeObserver() 
+0

ho provato questo e sembrava funzionare in tutti i casi testati, ma ora vedo getMeasuredWidth() restituendo 0 in produzione per alcuni utenti: ( –

+0

Grazie! Stavo usando '' 'OnPreDrawListener''' prima (ma sembra che non sia compatibile con alcuni dispositivi 4.4.4 e 6.0.1). Usando' '' onGlobalLayout''' e rimuovendo il listener proprio quando ' '' height> 0''' funziona perfettamente – JCarlos

+0

Cos'è 'v'? È venuto fuori dal nulla. –

0

Non è possibile utilizzare tali parametri nella chiamata measure. Provare a utilizzare questo:

final int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED); 
final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED); 
view.measure(widthMeasureSpec, heightMeasureSpec); 
0

Solo nel caso qualcuno stava sperimentando questo problema con ImageView:

ho notato che se il vostro ImageView non ha "android: src" set (cioè cambiare in modo dinamico) è restituirà sempre zero da getMeasuredWidth/Height.

Una soluzione semplice sarebbe quella di impostare un segnaposto per la visualizzazione.