Étant donné une vue, comment puis-je obtenir les vues enfants à l'intérieur?
J'ai donc une vue personnalisée et le débogueur montre que sous mChildren
il y a 7 autres vues. J'ai besoin d'un moyen d'accéder à ces vues, mais il ne semble pas qu'il existe une API publique pour le faire.
Aucune suggestion?
ÉDITER:
Ma vue personnalisée hérite de AdapterView
viewGroup
Si vous voulez non seulement obtenir tous les enfants directs, mais tous les enfants des enfants et ainsi de suite, vous devez le faire de manière récursive:
Pour utiliser le résultat, vous pouvez faire quelque chose comme ceci:
la source
for (int i = 0, n = vg.getChildCount(); i < n; i++)
Sur Android, accéder aux variables locales au lieu d'appeler une méthode a tendance à être beaucoup plus rapide. De cette façon, une méthode n'est appelée qu'une seule fois par groupe de vues, puis lors des exécutions suivantes, une variable locale est utilisée.Vous pouvez toujours accéder aux vues enfants via View.findViewById () http://developer.android.com/reference/android/view/View.html#findViewById(int ).
Par exemple, dans une activité / vue:
ou si vous avez une référence à une vue:
la source
Je vais juste fournir cette réponse comme une alternative à l'algorithme récursif de @ IHeartAndroid pour découvrir tous les enfants
View
dans une hiérarchie de vues. Notez qu'au moment de la rédaction de cet article, la solution récursive est imparfaite en ce qu'elle contiendra des doublons dans son résultat.Pour ceux qui ont du mal à comprendre la récursivité, voici une alternative non récursive. Vous obtenez des points bonus pour la réalisation de c'est aussi une largeur d'abord la recherche alternative à la profondeur première approche de la solution récursive.
Quelques tests rapides (rien de formel) suggèrent que cette alternative est également plus rapide, bien que cela ait probablement à voir avec le nombre de nouvelles
ArrayList
instances créées par l'autre réponse. En outre, les résultats peuvent varier en fonction du niveau vertical / horizontal de la hiérarchie des vues.Posté par: Android | Obtenir tous les éléments enfants d'un ViewGroup
la source
Voici une suggestion: vous pouvez obtenir le
ID
(spécifié par exemple parandroid:id="@+id/..My Str..
) qui a été généréR
en utilisant son nom donné (par exempleMy Str
). Un extrait de code utilisant lagetIdentifier()
méthode serait alors:À partir d'un
Activity
, un exemple d'utilisation associé àfindViewById
serait:la source
En guise de mise à jour pour ceux qui rencontrent cette question après 2018, si vous utilisez Kotlin, vous pouvez simplement utiliser la propriété d'extension Android KTX ViewGroup.children pour obtenir une séquence des enfants immédiats de View.
la source
Afin de rafraîchir une disposition de table (TableLayout), j'ai fini par devoir utiliser l'approche récursive mentionnée ci-dessus pour obtenir tous les enfants des enfants et ainsi de suite.
Ma situation a été quelque peu simplifiée car je n'avais besoin que de travailler avec LinearLayout et les classes qui en étaient étendues telles que TableLayout. Et je n'étais intéressé que par la recherche d'enfants TextView. Mais je pense que cela s'applique toujours à cette question.
La classe finale s'exécute en tant que thread séparé, ce qui signifie qu'elle peut faire d'autres choses en arrière-plan avant d'analyser les enfants. Le code est petit et simple et peut être trouvé sur github: https://github.com/jkincali/Android-LinearLayout-Parser
la source
Cette méthode prend toutes les vues à l'intérieur d'une mise en page, ceci est similaire à la réponse d'Alexander Kulyakhtin. La différence est qu'il accepte tout type de mise en page parente et renvoie une liste de tableaux de vues.
la source