2010-11-23 24 views
11

Estoy agregando una serie de vistas personalizadas a LinearLayout. He reemplazado el método onMeasure de estas vistas personalizadas, para devolver las dimensiones según ciertos parámetros. Según la entrada del usuario, me gustaría cambiar estos parámetros para cambiar el tamaño de las vistas. ¿Cómo puedo forzar a LinearLayout a "rediseñar" sus hijos para reflejar las nuevas dimensiones?En Android, ¿cómo volver a diseñar vistas?

Respuesta

22

Oh ... linearLayout.requestLayout().

+0

También puedes ver invalidate() – Thomas

+0

invalidate() no fue útil. No funcionó, supongo que porque la invalidación de un diseño obliga a todos los niños a volver a dibujarse, pero en realidad no cambia el tamaño ni retransmite los elementos secundarios. – ab11

+0

En la tableta Android OS 4.x (ICS), el relayouting no me ayudó. Lo que sí ayudó, fue eliminar 'getWindow(). RequestFeature (Window.FEATURE_NO_TITLE);' –

5

mi caso es que necesito volver a enviar a todos los niños inmediatamente. requestLayout() no lo hace de inmediato.

Para aquellos que tienen el mismo requisito conmigo:

Esto obligará a la redistribución niños de la vista inmediatamente (dado que la propia anchura y la altura de la vista no tiene que cambiar)

private void reLayoutChildren(View view) { 
    view.measure(
     View.MeasureSpec.makeMeasureSpec(view.getMeasuredWidth(), View.MeasureSpec.EXACTLY), 
     View.MeasureSpec.makeMeasureSpec(view.getMeasuredHeight(), View.MeasureSpec.EXACTLY)); 
    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
} 
+0

Esta es la única solución que funcionó para mí. 'invalidate' y' requestLayout' simplemente no lo harían, ¡así que gracias por este consejo! –

Cuestiones relacionadas