Tengo una vista personalizada que dibuja un mapa de bits desplazable en la pantalla. Para inicializarlo, necesito pasar el tamaño en píxeles del objeto de diseño primario. Pero durante las funciones onCreate y onResume, el diseño aún no se ha dibujado, por lo que layout.getMeasuredHeight () devuelve 0.
Como solución alternativa, he agregado un controlador para esperar un segundo y luego medir. Esto funciona, pero es descuidado, y no tengo idea de cuánto puedo recortar el tiempo antes de terminar antes de que se dibuje el diseño.
Lo que quiero saber es, ¿cómo puedo detectar cuándo se dibuja un diseño? ¿Hay algún evento o devolución de llamada?
fuente
view.post(Runnable)
, es más limpio y hace lo mismo.Una forma realmente fácil es simplemente llamar
post()
a su diseño. Esto ejecutará su código en el siguiente paso, después de que su vista ya se haya creado.fuente
Para evitar códigos y advertencias obsoletos, puede usar:
fuente
Mejor con las funciones de extensión de Kotlin.
fuente
Otra respuesta es:
intente comprobar las dimensiones de la vista en
onWindowFocusChanged
.fuente
Una alternativa a los métodos habituales es engancharse al dibujo de la vista.
OnPreDrawListener
se llama muchas veces cuando se muestra una vista, por lo que no hay una iteración específica en la que su vista tenga un ancho o alto medido válido. Esto requiere que verifique continuamente (view.getMeasuredWidth() <= 0
) o establezca un límite en la cantidad de veces que verifica si hay unmeasuredWidth
mayor que cero.También existe la posibilidad de que la vista nunca se dibuje, lo que puede indicar otros problemas con su código.
fuente
How can you tell when a layout has been drawn?
y usted está proporcionando un método al que llamaOnPreDrawListener
y,don't stop interrogating that view until it has provided you with a reasonable answer
por lo tanto, las objeciones a su solución deberían ser obvias.Simplemente verifíquelo llamando al método de publicación en su diseño o vista
fuente
post
solo pondrá en cola el ejecutable para que se ejecute después, no garantiza que se mida la vista, ni siquiera menos dibujada.Cuando
onMeasure
se llama, la vista obtiene su ancho / alto medido. Después de esto, puedes llamarlayout.getMeasuredHeight()
.fuente