2012-08-22 6 views
15

Come posso ottenere larghezza e altezza di un layout lineare definito in xml come fill_parent sia in altezza che in larghezza? Ho provato il metodo onmeasure ma non so perché non sta dando un valore esatto. Ho bisogno di questi valori in un'attività prima della conclusione del metodo oncreate.get altezza e larghezza del layout in fase di esecuzione android

+0

IIRC non è possibile ottenere l'altezza/larghezza di qualsiasi cosa prima che sia stata misurata. È stato assegnato quando è stato chiamato onSizeChanged, se si sostituisce onLayout tutte le viste dovrebbero avere un'altezza e una larghezza – tom502

+0

@ tom502 puoi darmi un collegamento o un pezzo di codice? Sarebbe di grande aiuto. – MGDroid

risposta

31

Supponiamo che io sono per ottenere una larghezza LinearLayout definito in XML. Devo avere riferimenti su XML. Definire LinearLayoutl come esempio.

l = (LinearLayout)findviewbyid(R.id.l1); 
ViewTreeObserver observer = l.getViewTreeObserver(); 
     observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 
       // TODO Auto-generated method stub 
       init(); 
      l.getViewTreeObserver().removeGlobalOnLayoutListener(
        this); 
     } 
    }); 

protected void init() { 
     int a= l.getHeight(); 
      int b = l.getWidth(); 
Toast.makeText(getActivity,""+a+" "+b,3000).show(); 
    } 
    callfragment(); 
} 
+1

Sii consapevole! Non ti darà valori prima che onCreate finisca. Ho pensato di averlo chiamato all'interno del metodo onCreate, il suo metodo di override verrà chiamato in ritardo. Quindi potrebbe sembrare che la tua applicazione vada lentamente, ma risolve il mio scopo. – MGDroid

5

I valori di larghezza e altezza vengono impostati dopo che il layout è stato creato, quando gli elementi sono stati posizionati vengono poi misurati. Alla prima chiamata a onSizeChanged i parms saranno 0 quindi se si usa quel controllo per questo.

Poco più in dettaglio qui https://groups.google.com/forum/?fromgroups=#!topic/android-developers/nNEp6xBnPiw

e qui http://developer.android.com/reference/android/view/View.html#Layout

Ecco come utilizzare onLayout:

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    int width = someView.getWidth(); 
    int height = someView.getHeight(); 
} 
2

Si potrebbe aggiungere il layout di cambiamento ascoltatore al layout e ottenere il più recente altezza e la larghezza o anche quello prima ultima modifica.

aggiunte a livello API 11

Aggiungere un ascoltatore che verrà chiamata quando i limiti della variazione vista causa dell'elaborazione layout.

LinearLayout myLinearLayout = (LinearLayout) findViewById(R.id.my_linear_layout); 
myLinearLayout.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) { 
      // Preventing extra work because method will be called many times. 
      if(height == (bottom - top)) 
       return; 

      height = (bottom - top); 
      // do something here... 
      } 
    }); 
3

Per farlo funzionare, è necessario controllare se il valore altezza desiderata è più grande di 0 - e prima quindi rimuovere l'ascoltatore onGlobalLayout e fare quello che vuoi con l'altezza. L'ascoltatore chiama il suo metodo continuamente e dalla prima chiamata non è garantito che la vista sia misurata correttamente.

final LinearLayout parent = (LinearLayout) findViewById(R.id.parentView); 
    parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      int availableHeight = parent.getMeasuredHeight(); 
      if(availableHeight>0) { 
       parent.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       //save height here and do whatever you want with it 
      } 
     } 
    }); 
+0

Questo ha fatto il trucco - grazie. La chiamata rimuovi listener è obsoleta dal livello 16 dell'API. In questo post viene descritto come supportare la chiamata per le API precedenti e successive http://stackoverflow.com/a/23741481/2162226 – gnB

Problemi correlati