2010-04-08 13 views
24

Estoy trabajando en un juego para Android. Para ayudar a implementarlo, mi idea es crear una subclase de una vista. Luego insertaría varias instancias de esta clase como hijos de la vista principal. Cada instancia manejaría la detección cuando se presionó (a través de OnTouchListener).¿Pasar por todas las subvistas de una vista de Android?

El problema que tengo ahora es ¿cómo recorro todas estas sub-vistas para poder leer sus estados y procesarlas? (Es decir, cuando todos alcanzan cierto estado, algo debe suceder).

¿O hay una mejor manera de tener varios objetos en la pantalla que responden al tacto y cuyo estado puedo verificar?

Respuesta

17

@jqpubliq Es correcto, pero si realmente quiere pasar por todas las vistas que simplemente puede utilizar los métodos getChildCount() y getChildAt() de ViewGroup. Un método recursivo simple hará el resto.

1

El uso de Views suena como que será brutalmente difícil renderizar algo bien si hay movimiento. Probablemente desee dibujar en Canvas o usar OpenGL a menos que esté haciendo algo realmente estático. Aquí hay un great talk de la conferencia de E/S del año pasado sobre cómo hacer juegos para Android. Es un poco largo y puedes saltarte unos 15 minutos. También la fuente está disponible. Eso te dará una buena idea de maneras de hacer las cosas

+0

Sí, hice la necesidad de hacerlo de otra manera, pero voy a probar esto primero. Es un juego casual. – Slapout

41

he hecho un pequeño ejemplo de una función recursiva:

public void recursiveLoopChildren(ViewGroup parent) { 
     for (int i = 0; i < parent.getChildCount(); i++) { 
      final View child = parent.getChildAt(i); 
      if (child instanceof ViewGroup) { 
       recursiveLoopChildren((ViewGroup) child); 
       // DO SOMETHING WITH VIEWGROUP, AFTER CHILDREN HAS BEEN LOOPED 
      } else { 
       if (child != null) { 
        // DO SOMETHING WITH VIEW 
       } 
      } 
     } 
    } 

La función comenzará bucle sobre Al elementos de la vista dentro de un ViewGroup (del último al primer elemento), si un niño es un ViewGroup continuación, reinicie la función con ese niño para recuperar todas las vistas anidadas dentro de ese niño.

+0

no funciona. cuando view contiene webView – Karacago

+2

Cualquier razón particular que haya elegido 'for (int i = parent.getChildCount() - 1; i> = 0; i -)' en lugar de 'for (int i = 0; i

+0

@PeterProkop Personalmente me gusta más este lazo. Funciona bien incluso si elimina uno de los elementos del ciclo, durante el ciclo. –

0

¿Por qué no usar simplemente una matriz o un vector para mantener el seguimiento de estas vistas? Esa sería la forma más simple y eficiente que pienso.

Cuestiones relacionadas