192 votes

Android - obtenir les enfants à l'intérieur d'un point de Vue?

Compte tenu de Vue comment puis-je obtenir de l'enfant vues de l'intérieur?

Donc, j'ai un Affichage personnalisé et le débogueur affiche qu'en vertu de l' mChildren il y a 7 autres points de vue. J'ai besoin d'un moyen d'accéder à ces points de vue, mais il ne semble pas comme il y a une API publique pour ce faire.

toutes les suggestions?

EDIT:

Ma vue personnalisée hérite AdapterView

344voto

Alex Points 15303
for(int i=0; i<((ViewGroup)v).getChildCount(); ++i) {
    View nextChild = ((ViewGroup)v).getChildAt(i);
}

Va que faire?

61voto

IHeartAndroid Points 874

Si vous ne voulez pas d'obtenir tous les enfants directs, mais tous les enfants et ainsi de suite, vous devez le faire de manière récursive:

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

Pour utiliser le résultat que vous pourriez faire quelque chose comme ceci:

    // 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");
    }

24voto

jonson Points 141

Vous pouvez toujours accéder à l'enfant vue par Vue.findViewById() http://developer.android.com/reference/android/view/View.html#findViewById(int).

Par exemple, au sein d'une activité / vue:

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

ou si vous avez une référence à une vue:

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

18voto

MH. Points 21672

Je vais juste vous fournir cette réponse comme une alternative @IHeartAndroid de l'algorithme récursif pour découvrir tous les enfants - Views en vue de la hiérarchie. Notez qu'au moment d'écrire ces lignes, la solution récursive est erronée en ce qu'elle contient des doublons dans son résultat.

Pour ceux qui ont des problèmes d'emballage de leur tête autour de la récursivité, voici un non-récursive alternative. Vous obtenez des points bonus pour la réalisation de ce est aussi une largeur tout d'abord la recherche d'alternative à la profondeur-première approche de la solution récursive.

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

Un couple de tests rapides (rien d'officiel) suggèrent que cette solution est également plus rapide, bien que cela a probablement à voir avec le nombre de nouveaux ArrayList des cas la réponse à crée. Aussi, les résultats peuvent varier en fonction de la façon verticale ou à l'horizontale, le point de vue de la hiérarchie.

Cross-posté depuis: Android | Obtenir tous les éléments enfants d'un ViewGroup

7voto

Vlad Points 94

Voici une suggestion: vous pouvez obtenir l' ID (spécifiée par exemple, en android:id="@+id/..My Str..) qui a été généré en R par l'utilisation de son nom (par exemple, My Str). Un extrait de code à l'aide de getIdentifier() méthode serait alors:

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

Dans un Activity, un exemple d'utilisation couplée avec findViewById serait:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X