Estoy escribiendo una aplicación con el único propósito de tratar de entender cómo funciona la jerarquía de vista en Android. Estoy teniendo algunos problemas realmente duros en este momento. Trataré de ser conciso en mi explicación aquí.Intentando comprender la jerarquía de vista
Configuración:
Actualmente tengo tres vistas. 2 son ViewGroups
y 1 es solo View
. Digamos que son en este orden:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
En mi Activity
simplemente mostrar los puntos de vista de este modo:
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
problemas:
El método de Testa
onDraw(Canvas canvas)
no es nunca llamado. He visto un par de soluciones a esto diciendo que mi vista no tiene ninguna dimensión (alto/ancho = 0), sin embargo, este no es el caso. Cuando anuloonLayout()
, obtengo las dimensiones de mi diseño y son correctas. Además, getHeight()/Width() son exactamente como deberían ser. También puedo anulardispatchDraw()
y obtener mis vistas base para dibujar.Quiero animar un objeto en
TestB
. Tradicionalmente, anularía el métodoonDraw()
en la llamadainvalidate()
en sí mismo hasta que el objeto termine la animación que se suponía que debía hacer. Sin embargo, enTestB
, cuando llamo alinvalidate()
, la vista nunca se vuelve a dibujar. Tengo la impresión de que el trabajo de mi padre es llamar al métodoonDraw()
de nuevo, pero mi vista principal no vuelve a llamar aldispatchDraw()
.
supongo que mis preguntas son, ¿por qué mi método de mi vista padre onDraw()
nunca llegan llamada para empezar? ¿Qué métodos en mi vista padre se supone que deben invocarse cuando uno de sus hijos se invalida? ¿Es el padre o la madre el responsable de garantizar que sus hijos se sienten atraídos o Android se ocupa de eso? Si Android responde al invalidate()
, ¿por qué mi TestB
nunca se vuelve a dibujar?
puede compartir este proyecto de demostración del grupo de visualización en su blog o en algún lugar será de mucha ayuda .. Gracias amigo ... – user1201239
¿necesito agregar el childView incluso si lo especificamos en XML? – user1201239
Lo siento. No tengo un blog ni nada para subir. Trataré de ser tan útil como pueda. Para responder a tu primera pregunta, no. Cuando infle el xml, el elemento secundario está contenido en el 'ViewGroup'. Lo más temprano que puede recuperarlo es 'onFinishInflate()'. Después de eso tienes una opción. Obtenga sus hijos a través del método 'getChildAt (int index)' o use 'findViewById (int id)'. El índice será el orden en que los niños se encuentran en xml. Sin embargo, no sé cómo funciona la indexación con niños dentro de los niños. – DeeV