ti-enxame.com

Android - colocar as crianças dentro de um View?

Dada uma View, como posso obter as visualizações das crianças nela?

Então eu tenho um View personalizado e o debugger mostra que sob mChildren existem 7 outras views. Eu preciso de uma maneira de acessar essas visualizações, mas parece que não há uma API pública para fazer isso.

alguma sugestão?

EDIT:

Minha visualização personalizada é herdada de AdapterView

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

Isso vai fazer?

285
Alexander Kulyakhtin

Se você não quer apenas receber todos os filhos diretos, mas todos os filhos de crianças e assim por diante, você tem que fazê-lo recursivamente:

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

Para usar o resultado, você poderia fazer algo assim:

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

Você sempre pode acessar exibições filho por meio de View.findViewById () http://developer.Android.com/reference/Android/view/View.html#findViewById (int ).

Por exemplo, dentro de uma atividade/visão:

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

ou se você tiver uma referência a uma visão:

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

Eu estou indo só para fornecer esta resposta como uma alternativa @ algoritmo recursivo do IHeartAndroid para descobrir todos os filhos Views em uma hierarquia de exibição. Observe que, no momento em que este texto foi escrito, , a solução recursiva é falha , pois conterá duplicatas em seu resultado.

Para aqueles que têm dificuldade em reciclar, aqui está uma alternativa não recursiva. Você ganha pontos de bônus por perceber que isso também é uma alternativa de pesquisa breadth-first para a abordagem depth-first da solução recursiva.

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

Alguns testes rápidos (nada formal) sugerem que essa alternativa também é mais rápida, embora isso tenha mais a ver com o número de novas instâncias de ArrayList criadas pela outra resposta. Além disso, os resultados podem variar com base em quão vertical/horizontal é a hierarquia de visualizações.

Cross-posted from: Android | Obter todos os elementos filhos de um ViewGroup

14
MH.

Aqui está uma sugestão: você pode obter o ID (especificado por Android:id="@+id/..My Str..) que foi gerado por R usando seu nome próprio (por exemplo, My Str). Um snippet de código usando o método getIdentifier() seria então:

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

De dentro de um Activity, um exemplo de uso associado a findViewById seria:

// 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

A fim de atualizar um layout de tabela (TableLayout) acabei tendo que usar a abordagem recursiva mencionada acima para obter todos os filhos das crianças e assim por diante.

Minha situação foi um pouco simplificada, porque eu só precisava trabalhar com o LinearLayout e as classes estendiam-se a partir dele, como o TableLayout. E eu só estava interessado em encontrar crianças TextView. Mas acho que ainda é aplicável a essa questão.

A última classe é executada como um thread separado, o que significa que pode fazer outras coisas em segundo plano antes de analisar para os filhos. O código é pequeno e simples e pode ser encontrado no github: https://github.com/jkincali/Android-LinearLayout-Parser

0
jkincali