Wie kann ich bei einer gegebenen Ansicht die untergeordneten Ansichten darin erhalten?
Ich habe also eine benutzerdefinierte Ansicht und der Debugger zeigt, dass es unter mChildren
7 anderen Ansichten gibt. Ich brauche eine Möglichkeit, auf diese Ansichten zuzugreifen, aber es scheint nicht, dass es eine öffentliche API gibt, um dies zu tun.
irgendwelche Vorschläge?
BEARBEITEN:
Meine benutzerdefinierte Ansicht erbt von AdapterView
viewGroup
Wenn Sie nicht nur alle direkten Kinder, sondern auch alle Kinder usw. haben möchten, müssen Sie dies rekursiv tun:
Um das Ergebnis zu verwenden, können Sie Folgendes tun:
quelle
for (int i = 0, n = vg.getChildCount(); i < n; i++)
Auf Android. Der Zugriff auf lokale Variablen anstelle des Aufrufs einer Methode ist in der Regel viel schneller. Auf diese Weise wird eine Methode nur einmal pro Ansichtsgruppe aufgerufen und bei nachfolgenden Läufen wird eine lokale Variable verwendet.Sie können jederzeit über View.findViewById () auf untergeordnete Ansichten zugreifen ( http://developer.android.com/reference/android/view/View.html#findViewById(int ).
Zum Beispiel innerhalb einer Aktivität / Ansicht:
oder wenn Sie einen Verweis auf eine Ansicht haben:
quelle
Ich werde diese Antwort nur als Alternative zum rekursiven Algorithmus von @ IHeartAndroid bereitstellen, um alle untergeordneten Elemente
View
in einer Ansichtshierarchie zu ermitteln. Beachten Sie, dass zum Zeitpunkt dieses Schreibens die rekursive Lösung insofern fehlerhaft ist , als sie Duplikate im Ergebnis enthält.Für diejenigen, die Probleme haben, sich mit Rekursion zu beschäftigen, ist hier eine nicht rekursive Alternative. Sie erhalten Bonuspunkte für diese Realisierung ist auch eine Breiten erste Suche Alternative zum depth-first Ansatz der rekursiven Lösung.
Ein paar schnelle Tests (nichts Formales) legen nahe, dass diese Alternative auch schneller ist, obwohl dies höchstwahrscheinlich mit der Anzahl neuer
ArrayList
Instanzen zu tun hat, die durch die andere Antwort erstellt werden. Die Ergebnisse können auch variieren, je nachdem, wie vertikal / horizontal die Ansichtshierarchie ist.Cross-posted von: Android | Holen Sie sich alle untergeordneten Elemente einer ViewGroup
quelle
Hier ist ein Vorschlag: Sie können das
ID
(z. B. vonandroid:id="@+id/..My Str..
) erhalten, das unterR
Verwendung des angegebenen Namens (zMy Str
. B. ) generiert wurde . Ein Code-Snippet mit dergetIdentifier()
Methode wäre dann:Von innen her ein
Activity
, gekoppelt ein Beispiel für die Verwendung mitfindViewById
wäre:quelle
Als Update für diejenigen, die nach 2018 auf diese Frage stoßen, können Sie bei Verwendung von Kotlin einfach die Android KTX- Erweiterungseigenschaft ViewGroup.children verwenden , um eine Sequenz der unmittelbaren untergeordneten Elemente der Ansicht abzurufen .
quelle
Um ein Tabellenlayout (TableLayout) zu aktualisieren, musste ich den oben erwähnten rekursiven Ansatz verwenden, um alle Kinder der Kinder usw. zu erhalten.
Meine Situation war etwas vereinfacht, da ich nur mit LinearLayout arbeiten musste und die daraus erweiterten Klassen wie TableLayout. Und ich war nur daran interessiert, TextView-Kinder zu finden. Aber ich denke, es ist immer noch auf diese Frage anwendbar.
Die letzte Klasse wird als separater Thread ausgeführt, was bedeutet, dass sie im Hintergrund andere Dinge tun kann, bevor sie für die Kinder analysiert. Der Code ist klein und einfach und kann unter github gefunden werden: https://github.com/jkincali/Android-LinearLayout-Parser
quelle
Diese Methode berücksichtigt alle Ansichten innerhalb eines Layouts. Dies ähnelt der Antwort von Alexander Kulyakhtin. Der Unterschied besteht darin, dass alle Arten von übergeordneten Layouts akzeptiert werden und eine Array-Liste mit Ansichten zurückgegeben wird.
quelle