Biorąc pod uwagę widok, jak mogę uzyskać w nim widoki dziecka?
Mam więc niestandardowy widok, a debugger pokazuje, że pod mChildren
jest 7 innych widoków. Potrzebuję sposobu, aby uzyskać dostęp do tych widoków, ale wygląda na to, że nie istnieje publiczny interfejs API, który to umożliwi.
jakieś sugestie?
EDYTOWAĆ:
Mój widok niestandardowy dziedziczy z AdapterView
viewGroup
Jeśli chcesz nie tylko uzyskać wszystkie bezpośrednie dzieci, ale wszystkie dzieci dzieci i tak dalej, musisz to zrobić rekurencyjnie:
Aby użyć wyniku, możesz zrobić coś takiego:
źródło
for (int i = 0, n = vg.getChildCount(); i < n; i++)
W systemie Android dostęp do zmiennych lokalnych zamiast wywoływania metody jest znacznie szybszy. W ten sposób metoda jest wywoływana tylko raz na grupę widoków, a następnie przy kolejnych uruchomieniach używana jest zmienna lokalna.Zawsze możesz uzyskać dostęp do widoków podrzędnych za pośrednictwem View.findViewById () http://developer.android.com/reference/android/view/View.html#findViewById(int ).
Na przykład w ramach działania / widoku:
lub jeśli masz odniesienie do widoku:
źródło
Podam tę odpowiedź jako alternatywę rekurencyjnego algorytmu @ IHeartAndroid do znajdowania wszystkich dzieci
View
w hierarchii widoków. Zauważ, że w chwili pisania tego rozwiązania rekurencyjne rozwiązanie jest błędne , ponieważ zawiera w swoim wyniku duplikaty.Dla tych, którzy mają problemy z owinięciem głowy wokół rekurencji, oto nierekurencyjna alternatywa. Otrzymujesz dodatkowe punkty za uświadomienie sobie, że jest to również alternatywa przeszukiwania wszerz w stosunku do podejścia opartego na głębokości w rozwiązaniu rekurencyjnym.
Kilka szybkich testów (nic formalnego) sugeruje, że ta alternatywa jest również szybsza, chociaż najprawdopodobniej ma to związek z liczbą nowych
ArrayList
instancji, które tworzy druga odpowiedź. Ponadto wyniki mogą się różnić w zależności od tego, jak pionowa / pozioma jest hierarchia widoków.Przeksięgowano z: Android | Pobierz wszystkie elementy podrzędne ViewGroup
źródło
Oto sugestia: możesz pobrać
ID
(określone np. Przezandroid:id="@+id/..My Str..
), które zostało wygenerowaneR
przez używając jego podanej nazwy (npMy Str
.). Fragment kodu korzystający zgetIdentifier()
metody wyglądałby wówczas następująco:Z wewnątrz
Activity
, przykładowe użycie w połączeniu zfindViewById
to:źródło
Jako aktualizacja dla tych, którzy napotkali to pytanie po 2018 roku, jeśli używasz Kotlina, możesz po prostu użyć właściwości rozszerzenia Android KTX ViewGroup.children, aby uzyskać sekwencję bezpośrednich elementów potomnych widoku.
źródło
Aby odświeżyć układ tabeli (TableLayout), musiałem użyć wspomnianego powyżej podejścia rekurencyjnego, aby uzyskać wszystkie dzieci i tak dalej.
Moja sytuacja została nieco uproszczona, ponieważ potrzebowałem pracować tylko z LinearLayout i tymi klasami z niego rozszerzonymi, takimi jak TableLayout. Interesowało mnie tylko znalezienie dzieci TextView. Ale myślę, że nadal ma to zastosowanie do tego pytania.
Ostatnia klasa działa jako osobny wątek, co oznacza, że może wykonywać inne czynności w tle przed analizowaniem dla dzieci. Kod jest mały i prosty i można go znaleźć na github: https://github.com/jkincali/Android-LinearLayout-Parser
źródło
Ta metoda obejmuje wszystkie widoki wewnątrz układu, jest to podobne do odpowiedzi Aleksandra Kulachtina. Różnica polega na tym, że akceptuje dowolny typ układów nadrzędnych i zwraca listę widoków w postaci tablicy.
źródło