2012-03-25 13 views
5

Utilizziamo la libreria di compatibilità dei frammenti e stiamo cercando di ottenere la larghezza del frammento, aggiunta a FrameLayout. In base al ciclo di vita dei frammenti, fino all'esecuzione di onCreateView, getView(). GetMeasuredWidth() deve restituire 0. Tuttavia, stiamo ricevendo 0 in onStart(), che viene dopo onCreateView e, pertanto, il valore restituito non deve essere 0.Ottimizzazione della larghezza del frammento 0 in onStart()

questo è frammento, che la larghezza vogliamo sapere:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<FrameLayout android:id="@+id/details" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/carbon_fiber"/> 

Perché questa anomalia sta accadendo? Qualsiasi aiuto sarà apprezzato.

+1

IMO questa è la parte più frustrante e non intuitivo di Android. Ci sono molti molti post su SO su questo. Penseresti che il team di Google aggiungerebbe una callback su Activity/Fragment per questo, qualcosa come "yourFrigginViewsHaveDimensionsNow()' sarebbe buono. –

risposta

-1

Penso che sia necessario definire lo android:class con la classe del proprio frammento.

1

È solo una supposizione, ma secondo Android Developers:

onStart() rende il frammento visibile all'utente (sulla base della sua attività, contenente sia avviato).

Così larghezza e l'altezza sarà calcolata solo dopo vostro frammento diventerà visibile.

Ma, forse, non ho ragione.

3

Simile a Attività, le viste nella gerarchia della vista non sono state misurate su Fragment :: onStart(). Per ottenere la dimensione della vista, è necessario creare un OnGlobalLayoutListener e utilizzarlo nel modo seguente:

Android get Fragment width

0

Ho incontrato lo stesso problema con un'attività. Avevo bisogno di una delle mie immagini per mantenere un rapporto 4: 6. Così semplice come ho trovato per i frammenti ho inserito il codice nel suo OnStart() per Attività era il OnWindowFocusChanged()

Da una ricerca è emerso che il layout non è ancora stato "disegnato". Quindi, quindi, nessun componente è stato misurato. Ci sono vari altri lavori in giro ma questa mi è sembrata l'implementazione più rapida.

0

In una situazione simile ho usato il metodo post() della classe View:

getView().post(new Runnable(){ 
    @Override 
    public void run(){ 
    //do your measurements here 
    } 
}); 
Problemi correlati