2011-12-07 19 views
19

Ho un thread in background che aggiorna l'interfaccia utente della mia attività, dopo lo onCreate(). Può aggiungere layout o modificare le dimensioni di altri.Come sapere quando un'attività termina un passaggio di layout?

Voglio semplicemente rilevare quando il passaggio di layout è terminato nella mia attività, per poter aggiornare manualmente le posizioni di altre viste che dipendono direttamente dai layout che erano appena aggiunti o modificati.

Per ora, mi basta usare un Handler con un postDelayed runnable che fa il lavoro, dopo un piccolo ritardo, intorno 50-100 ms dopo le modifs che fa scattare il requestLayout().

Funziona, ma possiamo ovviamente vedere il ritardo. Mi piacerebbe fare il lavoro il prima possibile. In un codice di visualizzazione è semplice rilevare il passaggio di misura, ma non trovo come risolverlo direttamente nell'attività.

risposta

39

Un GlobalLayoutListener genera un evento al completamento di un layout. Sarebbe adatto alle tue esigenze?

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. 
      } 
     }); 
1

oltre a Phillip Fitzsimmons accettato risposta, che è corretto, vorrei anche sottolineare che, se qualcuno ha bisogno di conoscere la dimensione della vista stessa, il metodo:

protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    // your code here 
} 

possono essere sovrascritti e sarà chiamato dopo il passaggio di layout.

+6

Anche se questo è corretto, voglio aggiungere che questo può essere chiamato due volte o anche più spesso in alcuni layout, dove il processo di misurazione sarà chiamato in modo ricorsivo (pesi ecc.). – JacksOnF1re

Problemi correlati