Dada uma visualização, como posso obter as visualizações filho dentro dela?
Então, eu tenho uma exibição personalizada e o depurador mostra que mChildren
há outras 7 visualizações. Eu preciso de uma maneira de acessar esses modos de exibição, mas não parece que exista uma API pública para fazer isso.
alguma sugestão?
EDITAR:
Minha visualização personalizada herda de AdapterView
viewGroup
Se você não quer apenas ter filhos diretos, mas também filhos de todos os filhos, é necessário fazê-lo recursivamente:
Para usar o resultado, você pode fazer algo assim:
fonte
for (int i = 0, n = vg.getChildCount(); i < n; i++)
Android, acessar variáveis locais em vez de chamar um método tende a ser muito mais rápido. Dessa forma, um método é chamado apenas uma vez por grupo de visualizações e, em execuções subsequentes, uma variável local é usada.Você sempre pode acessar visualizações filho via View.findViewById () http://developer.android.com/reference/android/view/View.html#findViewById(int ).
Por exemplo, dentro de uma atividade / exibição:
ou se você tiver uma referência a uma visualização:
fonte
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.
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
fonte
Aqui está uma sugestão: você pode obter o
ID
(especificado, por exemplo, porandroid:id="@+id/..My Str..
), que foi geradoR
usando o seu nome (por exemploMy Str
). Um trecho de código usando ogetIdentifier()
método seria:De dentro de
Activity
, um exemplo de uso associado afindViewById
:fonte
Como uma atualização para aqueles que se deparam com essa pergunta depois de 2018, se você estiver usando o Kotlin, basta usar a propriedade de extensão Android KTX ViewGroup.children para obter uma sequência dos filhos imediatos do View.
fonte
Para atualizar um layout de tabela (TableLayout), acabei tendo que usar a abordagem recursiva mencionada acima para obter todos os filhos das crianças e assim por diante.
Minha situação foi um pouco simplificada, porque eu só precisava trabalhar com LinearLayout e essas classes foram estendidas, como TableLayout. E eu só estava interessado em encontrar crianças TextView. Mas acho que ainda é aplicável a essa pergunta.
A classe final é executada como um thread separado, o que significa que pode fazer outras coisas em segundo plano antes de analisar os filhos. O código é pequeno e simples e pode ser encontrado no github: https://github.com/jkincali/Android-LinearLayout-Parser
fonte
Este método utiliza todas as visualizações dentro de um layout, semelhante à resposta de Alexander Kulyakhtin. A diferença é que ele aceita qualquer tipo de layout pai e retorna uma lista de visualizações de matriz.
fonte