2011-12-07 14 views
19

Tengo un hilo de fondo que actualiza la interfaz de usuario de mi actividad, después del onCreate(). Puede agregar diseños o cambiar el tamaño de otros.¿Cómo saber cuándo una actividad termina un pase de disposición?

Simplemente quiero detectar cuándo el pase de disposición finaliza en mi actividad, para poder actualizar manualmente las posiciones de otras vistas que dependen directamente de los diseños que se acaban de agregar o modificar.

Por ahora, sólo tiene que utilizar un Handler con un postDelayed runnable que hace el trabajo, después de un pequeño retraso, alrededor de 50-100 ms después de los modifs que desencadena la requestLayout().

Funciona, pero obviamente podemos ver el retraso. Me gustaría hacer el trabajo lo antes posible. En un código de vista es simple detectar el pase de medición, pero no encuentro cómo resolverlo directamente en la actividad.

Respuesta

39

Un GlobalLayoutListener disparará un evento al completar un diseño. ¿Eso se adaptaría a tus necesidades?

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

además de Phillip Fitzsimmons aceptadas respuesta, lo cual es correcto, me gustaría también resaltar que si alguien necesita saber el tamaño de la vista en sí, el método:

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

Se pueden anular y se llamará después del pase de disposición.

+6

Aunque esto es correcto, quiero agregar que esto se puede llamar dos veces o incluso más a menudo en algunos diseños, donde el proceso de medición se llamará recursivamente (pesos, etc.). – JacksOnF1re

Cuestiones relacionadas