it-swarm.com.de

Android - Kinder in eine Ansicht holen?

Angesichts einer Ansicht, wie kann ich die untergeordneten Ansichten darin abrufen?

Ich habe also eine benutzerdefinierte Ansicht und der Debugger zeigt, dass es unter mChildren 7 andere Ansichten gibt. Ich brauche eine Möglichkeit, auf diese Ansichten zuzugreifen, aber es scheint nicht so, als gäbe es eine öffentliche API, um dies zu tun.

irgendwelche Vorschläge?

EDIT:

Meine benutzerdefinierte Ansicht erbt von AdapterView

154
aryaxt
for(int index=0; index<((ViewGroup)viewGroup).getChildCount(); ++index) {
    View nextChild = ((ViewGroup)viewGroup).getChildAt(index);
}

Wird das gehen?

290

Wenn Sie nicht nur alle direkten Kinder, sondern auch alle Kindeskinder usw. haben möchten, müssen Sie dies rekursiv tun:

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 vg = (ViewGroup) v;
    for (int i = 0; i < vg.getChildCount(); i++) {

        View child = vg.getChildAt(i);

        ArrayList<View> viewArrayList = new ArrayList<View>();
        viewArrayList.add(v);
        viewArrayList.addAll(getAllChildren(child));

        result.addAll(viewArrayList);
    }
    return result;
}

Um das Ergebnis zu verwenden, können Sie Folgendes tun:

    // check if a child is set to a specific String
    View myTopView;
    String toSearchFor = "Search me";
    boolean found = false;
    ArrayList<View> allViewsWithinMyTopView = getAllChildren(myTopView);
    for (View child : allViewsWithinMyTopView) {
        if (child instanceof TextView) {
            TextView childTextView = (TextView) child;
            if (TextUtils.equals(childTextView.getText().toString(), toSearchFor)) {
                found = true;
            }
        }
    }
    if (!found) {
        fail("Text '" + toSearchFor + "' not found within TopView");
    }
55
IHeartAndroid

Sie können jederzeit über View.findViewById () http://developer.Android.com/reference/Android/view/View.html#findViewById (int ) auf untergeordnete Ansichten zugreifen.

Zum Beispiel innerhalb einer Aktivität/Ansicht:

...
private void init() {
  View child1 = findViewById(R.id.child1);
}
...

oder wenn Sie einen Verweis auf eine Ansicht haben:

...
private void init(View root) {
  View child2 = root.findViewById(R.id.child2);
}
17
jonson

Ich werde diese Antwort nur als Alternative zu IHeartAndroids rekursivem Algorithmus zum Erkennen aller untergeordneten Views in einer Ansichtshierarchie bereitstellen. Beachten Sie, dass die rekursive Lösung zum Zeitpunkt des Schreibens insofern einen Fehler aufweist , als sie im Ergebnis Duplikate enthält.

Für diejenigen, die Probleme haben, Rekursionen in den Kopf zu schließen, gibt es hier eine nicht-rekursive Alternative. Sie erhalten Bonuspunkte dafür, dass dies auch eine Breitensuche Alternative zum Tiefensuche Ansatz der rekursiven Lösung ist.

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) legen nahe, dass diese Alternative auch schneller ist, obwohl dies höchstwahrscheinlich mit der Anzahl neuer ArrayList Instanzen zu tun hat, die die andere Antwort erstellt. Die Ergebnisse können auch variieren, je nachdem, wie vertikal/horizontal die Ansichtshierarchie ist.

Weitergeleitet von: Android | Alle untergeordneten Elemente einer ViewGroup abrufen

15
MH.

Hier ist ein Vorschlag: Sie können den ID (angegeben durch zB Android:id="@+id/..My Str..) Erhalten, der durch R unter Verwendung seines gegebenen Namens erzeugt wurde (zB My Str) . Ein Code-Snippet mit der getIdentifier() -Methode wäre dann:

public int getIdAssignedByR(Context pContext, String pIdString)
{
    // Get the Context's Resources and Package Name
    Resources resources = pContext.getResources();
    String packageName  = pContext.getPackageName();

    // Determine the result and return it
    int result = resources.getIdentifier(pIdString, "id", packageName);
    return result;
}

Innerhalb eines Activity wäre eine mit findViewById gekoppelte Beispielverwendung:

// Get the View (e.g. a TextView) which has the Layout ID of "UserInput"
int rID = getIdAssignedByR(this, "UserInput")
TextView userTextView = (TextView) findViewById(rID);
5
vanangelov

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, weil ich nur mit LinearLayout und den daraus erweiterten Klassen wie TableLayout arbeiten musste. 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 vor dem Parsen für die Kinder andere Dinge im Hintergrund ausführen kann. Der Code ist klein und einfach und kann unter github gefunden werden: https://github.com/jkincali/Android-LinearLayout-Parser

0
jkincali