una programacion orientado orientada objetos metodos lista ejemplos ejemplo crear como clase android layoutparams

android - programacion - Después de cambiar una propiedad en un objeto LayoutParams, ¿necesito llamar a setLayoutParams nuevamente?



programacion de objetos en javascript (1)

Tengo una vista (que contiene un anuncio) que necesito escalar para ajustarme al ancho de la pantalla en un momento determinado (después de que se carga el anuncio). Así que tengo un método setHeight(myView) que calcula la altura correcta para el ancho de pantalla dado y cambia los LayoutParams de la Vista en consecuencia. La parte crucial del código es esta:

LayoutParams params = myView.getLayoutParams(); int width = myView.getWidth(); if (params != null && width > 0) { params.height = (int) Math.round(ratio * width); }

Esto parece funcionar en su mayor parte, pero a veces la vista no se escala. Parece que solo funciona consistentemente si agrego la siguiente línea en la parte inferior:

myView.setLayoutParams(params);

Esto también parece tener sentido, ya que las Vistas de Android llaman a requestLayout() en su método setLayoutParams() . Por el contrario, no veo cómo un cambio en un campo público ( params.height ) provocaría un cambio de diseño.

Por otro lado, encuentro repetidamente tutoriales en la red donde los parámetros simplemente se cambian y luego no se configuran nuevamente en la vista.

Entonces, mi pregunta es: ¿es correcto que, para actualizar inmediatamente el diseño después de cambiar una propiedad de los LayoutParams, necesito volver a llamar a setLayoutParams ? ¿Y que simplemente cambiar la propiedad solo llevará a un cambio de diseño en algún momento posterior cuando el cambio de diseño se active desde otro lugar?


Un cambio en los parámetros de diseño solo tendrá efecto en la siguiente pasada de diseño.

  • requestLayout() programa un pase de diseño

  • setLayoutParams() llama a requestLayout() como has observado

  • A veces, un pase de diseño se programa por otros medios. Por ejemplo, inmediatamente después del inflado, los parámetros de diseño también se han inflado y el mensaje de medida / diseño se acaba de publicar en la cola de mensajes de la interfaz de usuario para su procesamiento posterior.

Entonces, para estar seguro, llame a requestLayout() siempre después de tocar los parámetros de diseño. setLayoutParams() funciona, aunque no es estrictamente necesario al modificar los parámetros in situ.