2011-08-03 17 views
18

He creado una vista personalizada (llamémosla MyView) que básicamente solo dibuja texto sobre sí misma utilizando el lienzo. El texto que se dibujará se establece utilizando una variable global.Forzar una vista para volver a dibujarse

En algún momento durante la ejecución del programa, deseo cambiar la variable global y hacer que el MyView se vuelva a dibujar para actualizar el texto. Intenté findViewById() y luego invalidate(), pero esto no hace nada. Sospecho que, dado que nada en el MyView ha cambiado, cree que no tiene motivos para llamar al onDraw(). ¿Hay alguna manera de obligar a una Vista a volver a dibujarse, incluso si cree que no es necesario?

Respuesta

30

Si tengo una variable miembro dentro de la MyView que almacena el texto y crear un regulador pública para que, a continuación, sólo llamar a ese método hace que el MyView a dibujarse

Configuración de una variable dentro de la View no invocará un sorteo en la Vista. De hecho, tampoco el sistema de visualización conoce ni se preocupa por las variables internas.

Invocando invalidate() en una vista hace que se dibuje a sí mismo a través de la vista. Debería verificar esto: http://developer.android.com/guide/topics/ui/custom-components.html.

A TextView se invalida internamente al invocar setText() y se vuelve a dibujar con el nuevo texto establecido mediante la llamada setText(). También deberías hacer algo similar.

+1

Lo siento, tienes razón, de hecho llamé 'invalidate()'. Quería decir que llamar a 'invalidate()' no funcionaba porque la variable que estaba cambiando era externa a 'View' (era global). Entonces creé una variable interna y la cambié antes de invalidar. –

0

Bien, así que lo descubrí. Si tengo una variable miembro dentro del MyView que almacena el texto y crea un setter público para él, al llamar a ese método ocasiona que el MyView se vuelva a dibujar. ¡Sencillo!

Cuestiones relacionadas