Dada una vista, ¿cómo puedo obtener las vistas secundarias dentro de ella?
Así que tengo una vista personalizada y el depurador muestra que debajo mChildren
hay otras 7 vistas. Necesito una forma de acceder a estas vistas, pero no parece que haya una API pública para hacerlo.
¿alguna sugerencia?
EDITAR:
Mi vista personalizada hereda de AdapterView
viewGroup
Si no solo desea obtener todos los hijos directos, sino también los hijos de todos los niños, etc., debe hacerlo de forma recursiva:
Para usar el resultado, podría hacer algo como esto:
fuente
for (int i = 0, n = vg.getChildCount(); i < n; i++)
Android, acceder a variables locales en lugar de llamar a un método tiende a ser mucho más rápido. De esta manera, se llama a un método solo una vez por grupo de vista y luego, en ejecuciones posteriores, se utiliza una variable local.Siempre puede acceder a las vistas secundarias a través de View.findViewById () http://developer.android.com/reference/android/view/View.html#findViewById(int ).
Por ejemplo, dentro de una actividad / vista:
o si tiene una referencia a una vista:
fuente
Solo voy a proporcionar esta respuesta como un algoritmo recursivo alternativo de @ IHeartAndroid para descubrir a todos los niños
View
en una jerarquía de vistas. Tenga en cuenta que en el momento de escribir este artículo, la solución recursiva es defectuosa ya que contendrá duplicados en su resultado.Para aquellos que tienen problemas para entender la recursividad, aquí hay una alternativa no recursiva. Obtiene puntos de bonificación por darse cuenta de que esto también es una alternativa de búsqueda de primer orden al enfoque de profundidad de la solución recursiva.
Un par de pruebas rápidas (nada formal) sugieren que esta alternativa también es más rápida, aunque es probable que tenga que ver con la cantidad de nuevas
ArrayList
instancias que crea la otra respuesta. Además, los resultados pueden variar según la verticalidad / horizontalidad de la jerarquía de vistas.Publicación cruzada desde: Android | Obtenga todos los elementos secundarios de un ViewGroup
fuente
Aquí hay una sugerencia: puede obtener el
ID
(especificado, por ejemplo, porandroid:id="@+id/..My Str..
) que se generóR
utilizando su nombre de pila (por ejemploMy Str
). Un fragmento de código que usa elgetIdentifier()
método sería:Desde dentro de
Activity
, un ejemplo de uso junto confindViewById
sería:fuente
Como una actualización para aquellos que se encuentran con esta pregunta después de 2018, si está usando Kotlin, simplemente puede usar la propiedad de extensión KTX de Android ViewGroup.children para obtener una secuencia de los hijos inmediatos de la Vista.
fuente
Para actualizar un diseño de tabla (TableLayout) terminé teniendo que usar el enfoque recursivo mencionado anteriormente para obtener todos los hijos de los niños, etc.
Mi situación se simplificó de alguna manera porque solo necesitaba trabajar con LinearLayout y esas clases se extendieron como TableLayout. Y solo estaba interesado en encontrar niños TextView. Pero creo que todavía es aplicable a esta pregunta.
La clase final se ejecuta como un hilo separado, lo que significa que puede hacer otras cosas en segundo plano antes de analizar para los niños. El código es pequeño y simple y se puede encontrar en github: https://github.com/jkincali/Android-LinearLayout-Parser
fuente
Este método toma todas las vistas dentro de un diseño, esto es similar a la respuesta de Alexander Kulyakhtin. La diferencia es que acepta cualquier tipo de diseño principal y devuelve una Lista de vistas de matriz.
fuente