2011-09-22 9 views
5

Ho creato un layout personalizzato che estende ViewGroup. Tutto sta funzionando bene e sto ottenendo il layout come previsto.Intervallo di fine del gruppo di eventi Gonfiaggio

Desidero modificare dinamicamente un elemento nel layout. Tuttavia questo non funziona come lo chiamo in onCreate e fino a quel momento l'intero layout non è effettivamente (disegnato) gonfiato sullo schermo e quindi non ha dimensioni reali.

C'è qualche evento che può essere utilizzato per scoprire quando viene effettuato il gonfiaggio del layout? Ho provato suFinishInflate ma ciò non funzionerebbe poiché Viewgroup ha più viste e questo sarebbe chiamato più volte.

Sto pensando di creare un'interfaccia nella classe di layout personalizzata ma non sono sicuro quando attivarla?

risposta

20

Se ho capito bene le vostre esigenze, un OnGlobalLayoutListener può darti quello che bisogno.

View myView=findViewById(R.id.myView); 
    myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       //At this point the layout is complete and the 
       //dimensions of myView and any child views are known. 
      } 
     }); 
+0

L'ho usato per qualche tempo per regolare il testo in textview, non sapevo che potesse essere usato anche per ViewGroup. Grazie per l'aiuto! – PravinCG

2

Generalmente durante la creazione di un layout personalizzato che estende View o ViewGroup, è necessario sostituire protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) e protected void onLayout(boolean changed, int left, int top, int right, int bottom). Questi sono chiamati durante il processo di inflazione al fine di ottenere le dimensioni e le informazioni sulla posizione relative alla vista. Inoltre, successivamente, se si estende ViewGroup, è necessario chiamare measure(int widthMeasureSpec, int heightMeasureSpec) e layout(int l, int t, int r, int b) su ogni vista secondaria contenuta all'interno. (measure() viene chiamato in onMeasure() e layout() viene chiamato in onLayout()).

Ad ogni modo, in onMeasure(), generalmente si fa qualcosa del genere.

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    // Gather this view's specs that were passed to it 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

    int chosenWidth = DEFAULT_WIDTH; 
    int chosenHeight = DEFAULT_HEIGHT; 
    if(widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY) 
     chosenWidth = widthSize; 
    if(heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.EXACTLY) 
     chosenHeight = heightSize; 

    setMeasuredDimension(chosenWidth, chosenHeight); 

    *** NOW YOU KNOW THE DIMENSIONS OF THE LAYOUT *** 
} 

In onLayout() si ottenere le coordinate effettive pixel della vista, in modo da poter ottenere la dimensione fisica in questo modo:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) 
{ 
    // Android coordinate system starts from the top-left 
    int width = right - left; 
    int height = bottom - top; 
} 
+0

Grazie per la risposta. Ho fatto tutto ciò che hai prescritto la mia query poiché il valore sarà dinamico, come posso passare i dati dall'attività e, soprattutto, quando (evento) ?? – PravinCG

+1

Ok. Ho pensato che stavi cambiando la vista dinamicamente all'interno della vista. In tal caso, puoi utilizzare questi due metodi per scoprire le tue coordinate (anche prima che sia visibile). Un'altra opzione potrebbe usare 'onWindowFocusChanged()' che fa parte di 'Activity'. Secondo la documentazione 'Chiamato quando la finestra corrente dell'attività guadagna o perde lo stato attivo. Questo è l'indicatore migliore se questa attività è visibile all'utente. L'implementazione predefinita cancella lo stato di tracciamento della chiave, quindi dovrebbe sempre essere chiamato. "L'ho usato per determinare quando una finestra era in vista (quindi gonfiata). – DeeV

+0

+1, grazie per la risposta. Il metodo di cui sopra non è il modo affidabile per farlo anche se potrebbe funzionare in alcuni casi. – PravinCG

Problemi correlati