Android | Holen Sie sich alle Kinderelemente einer ViewGroup

getChildAt(i) bekommt nur die direkten Kinder einer ViewGroup , ist es möglich, auf alle Kinder zuzugreifen, ohne verschachtelte Loops zu machen?

  • Android geteilte Voreinstellungen nicht speichern
  • Feuer-Benachrichtigung alle 24 Stunden und zum genauen Zeitpunkt von 8 Uhr
  • Android WebView-Blöcke von https auf http umleiten
  • Erstellen Sie Skript in Cordova fehlschlägt mit unerwarteten Fehler in Ubuntu 12.10
  • RecyclerView onClick notifyItemRemoved löst nicht onBindView aus
  • Android Log.v (), Log.d (), Log.i (), Log.w (), Log.e () - Wann sollte jeder benutzt werden?
  • Android: Strings Ressourcen programmgesteuert ändern
  • Was? Android: attr / listPreferredItemHeight macht und wie?
  • Android Buch für Entwicklung
  • Einstellungen speichern
  • Erster Lauf von Android Studio. Kann nicht auf Android SDK-Add-On-Liste zugreifen
  • Könnte jemand einmal und für alle bitte erklären Kann nicht anrufen determinierbarkeit () - sah nie eine Verbindung für die pid
  • 5 Solutions collect form web for “Android | Holen Sie sich alle Kinderelemente einer ViewGroup”

    ( Quelle )

    Wenn du alle Kinderbetrachtungen bekommen möchtest, sowie die Ansichten in den Kindern ViewGroups , musst du es rekursiv machen, da es in der API keine Vorkehrungen gibt, dies aus der Box zu machen.

     private ArrayList<View> getAllChildren(View v) { if (!(v instanceof ViewGroup)) { ArrayList<View> viewArrayList = new ArrayList<View>(); viewArrayList.add(v); return viewArrayList; } ArrayList<View> result = new ArrayList<View>(); ViewGroup viewGroup = (ViewGroup) v; for (int i = 0; i < viewGroup.getChildCount(); i++) { View child = viewGroup.getChildAt(i); ArrayList<View> viewArrayList = new ArrayList<View>(); viewArrayList.add(v); viewArrayList.addAll(getAllChildren(child)); result.addAll(viewArrayList); } return result; } 

    Dies gibt dir eine ArrayList mit allen Ansichten in der Hierarchie, die du dann übertreiben kannst.

    Im Wesentlichen nennt sich dieser Code, wenn er eine weitere ViewGroup in der Hierarchie findet und dann eine ArrayList zurückgibt, die der größeren ArrayList hinzugefügt werden soll.

    Zum Zeitpunkt des Schreibens dieser Antwort ist die akzeptierte Antwort fehlerhaft, dass es Duplikate in seinem Ergebnis enthält.

    Für diejenigen, die Schwierigkeiten haben, ihren Kopf um Rekursion zu wickeln, ist hier eine nicht rekursive Alternative. Sie erhalten Bonuspunkte für die Realisierung dieses ist auch eine breite-erste Suchalternative zum Tiefen-ersten Ansatz der anderen Antwort.

     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; } 

    Ein paar schnelle Tests (nichts formales) deuten darauf hin, dass diese Alternative auch schneller ist, obwohl das am ehesten mit der Anzahl der neuen ArrayList Instanzen zu tun hat, die die andere Antwort schafft. Außerdem können die Ergebnisse variieren, je nachdem, wie vertikal / horizontal die Ansichtshierarchie ist.

    Ich habe diese Methode rekursiv umgesetzt. Nicht sicher, es ist schneller als MH's, aber zumindest hat es keine Duplikate.

     private List<View> getAllViews(View v) { if (!(v instanceof ViewGroup) || ((ViewGroup) v).getChildCount() == 0) // It's a leaf { List<View> r = new ArrayList<View>(); r.add(v); return r; } else { List<View> list = new ArrayList<View>(); list.add(v); // If it's an internal node add itself int children = ((ViewGroup) v).getChildCount(); for (int i=0;i<children;++i) { list.addAll(getAllViews(((ViewGroup) v).getChildAt(i))); } return list; } } 

    Die Antwort von MH umfasst die übergeordnete Ansicht, die der Methode gegeben wird, also habe ich diese Hilfsmethode (die so genannt wird) erstellt.

    Ich meine, wenn Sie diese Methode auf einem TextView (das keine Kinder hat) nennen, gibt es 0 statt 1 zurück.

     private List<View> getAllChildren(View v) { List list = getAllViews(v); list.remove(v); return list; } 

    TLDR: um alle Kinder zu zählen, kopiere und füge beide Methoden ein, ruf getAllChildren ()

    Ich weiß nicht, ob es gut oder nicht ist. Einfach die onViewAdded (View child) -Methode überschreiben und füge einfach die Ansichten in List<View> .Gib es Gedanken durch die docs. Dies ist nützlich, wenn du eine benutzerdefinierte View-Gruppe schreibst

    Wird aufgerufen, wenn ein neues Kind zu dieser ViewGroup hinzugefügt wird. Overrides sollte immer super.onViewAdded aufrufen.

     @Override public void onViewAdded(View child) { super.onViewAdded(child); views.add(child);//add in list and then use it later } 

    Hier ist meine (rekursive) Lösung, die die Hierarchie so ausdruckt:

     android.widget.LinearLayout children:2 id:-1 android.view.View id:2131624246 android.widget.RelativeLayout children:2 id:2131624247 android.support.v7.widget.AppCompatTextView id:2131624248 android.support.v7.widget.SwitchCompat id:2131624249 public static String getViewHierarcy(ViewGroup v) { StringBuffer buf = new StringBuffer(); printViews(v, buf, 0); return buf.toString(); } private static String printViews(ViewGroup v, StringBuffer buf, int level) { final int childCount = v.getChildCount(); v.getId(); indent(buf, level); buf.append(v.getClass().getName()); buf.append(" children:"); buf.append(childCount); buf.append(" id:"+v.getId()); buf.append("\n"); for (int i = 0; i < childCount; i++) { View child = v.getChildAt(i); if ((child instanceof ViewGroup)) { printViews((ViewGroup) child, buf, level+1); } else { indent(buf, level+1); buf.append(child.getClass().getName()); buf.append(" id:"+child.getId()); buf.append("\n"); } } return buf.toString(); } private static void indent(StringBuffer buf, int level) { for (int i = 0; i < level; i++) { buf.append(" "); } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.