Vou apenas fornecer essa resposta como um algoritmo recursivo do @HeartAndroid alternativo para descobrir todas as crianças View
em uma hierarquia de exibição. Observe que, no momento da redação deste artigo, a solução recursiva é falha , pois contém duplicatas em seu resultado.
Para aqueles que têm problemas para entender a recursão, aqui está uma alternativa não recursiva. Você ganha pontos de bônus para perceber isso é também um em largura alternativa de pesquisa para a profundidade-primeira abordagem da solução recursiva.
private List<View> getAllChildrenBFS(View v) {
List<View> visited = new ArrayList<View>();
List<View> unvisited = new ArrayList<View>();
unvisited.add(v);
while (!unvisited.isEmpty()) {
View child = unvisited.remove(0);
visited.add(child);
if (!(child instanceof ViewGroup)) continue;
ViewGroup group = (ViewGroup) child;
final int childCount = group.getChildCount();
for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
}
return visited;
}
Alguns testes rápidos (nada formal) sugerem que essa alternativa também é mais rápida, embora isso provavelmente tenha a ver com o número de novas ArrayList
instâncias que a outra resposta cria. Além disso, os resultados podem variar de acordo com a vertical / horizontal da hierarquia de visualizações.
Publicado em: Android | Obter todos os elementos filhos de um ViewGroup