studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android view

para - manual de programacion android pdf



Android: ¿conseguir niños dentro de una vista? (6)

Aquí hay una sugerencia: puedes obtener la ID (especificada por ejemplo por android:id="@+id/..My Str.. ) que fue generada por R usando su nombre de pila (ej. My Str ). Un fragmento de código usando getIdentifier() método getIdentifier() sería:

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

Desde dentro de una Activity , un uso de ejemplo junto con findViewById sería:

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

Dada una Vista, ¿cómo puedo obtener las vistas de los niños dentro de ella?

Así que tengo una vista personalizada y el depurador muestra que bajo mChildren hay otras 7 vistas. Necesito una forma de acceder a estas vistas, pero no parece que haya una API pública para hacer esto.

¿alguna sugerencia?

EDITAR:

Mi vista personalizada hereda de AdapterView


Para actualizar el diseño de una mesa (TableLayout) terminé usando el enfoque recursivo mencionado anteriormente para obtener todos los niños de los niños, y así sucesivamente.

Mi situación se simplificó un poco porque solo necesitaba trabajar con LinearLayout y esas clases se extendían desde allí, como TableLayout. Y solo estaba interesado en encontrar niños de TextView. Pero creo que todavía es aplicable a esta pregunta.

La clase final se ejecuta como un hilo separado, lo que significa que puede hacer otras cosas en el fondo antes de analizar para los niños. El código es pequeño y simple y se puede encontrar en github: https://github.com/jkincali/Android-LinearLayout-Parser


Si no solo quiere obtener a todos los niños directos, sino a todos los niños, etc., debe hacerlo 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 el resultado, podrías hacer algo como esto:

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


Siempre puede acceder a vistas secundarias a través de View.findViewById () http://developer.android.com/reference/android/view/View.html#findViewById(int ).

Por ejemplo, dentro de una actividad / vista:

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

o si tiene una referencia a una vista:

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


Solo voy a proporcionar esta respuesta como un algoritmo recursivo alternativo de @IeartAndroid para descubrir todas las View secundarias en una jerarquía de vistas. Tenga en cuenta que en el momento de escribir esto, la solución recursiva es defectuosa porque contiene duplicados en su resultado.

Para aquellos que tienen problemas para resolver recursiones, aquí hay una alternativa no recursiva. Obtiene puntos de bonificación por darse cuenta de que esta es también una alternativa de búsqueda de amplitud para el enfoque de profundidad de la solución 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; }

Un par de pruebas rápidas (nada formal) sugieren que esta alternativa también es más rápida, aunque es más probable que eso tenga que ver con el número de nuevas instancias de ArrayList crea la otra respuesta. Además, los resultados pueden variar en función de cuán vertical / horizontal sea la jerarquía de vistas.

Publicación cruzada desde: Android | Obtenga todos los elementos secundarios de un ViewGroup


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

¿Eso hará?