2011-01-26 32 views
52

Tengo una vista con radios, entradas y un botón y cuando hago clic en ella, quiero verificar que todas las entradas contengan información. ¿Cómo puedo iterar a través de los elementos de la vista en la actividad y verificar si cada vista de texto cumple con el requisito antes mencionado? Gracias.Cómo iterar a través de los elementos de una vista

Respuesta

108

que he hecho algo similar en algún código no tengo conmigo en este momento, pero a partir de la memoria que debe ser algo como esto (suponiendo una vista padre LinearLayout con un ID de "diseño"):

LinearLayout layout = (LinearLayout)findViewById(R.id.layout); 
boolean success = formIsValid(layout); 

public boolean formIsValid(LinearLayout layout) { 
    for (int i = 0; i < layout.getChildCount(); i++) { 
     View v = layout.getChildAt(i); 
     if (v instanceof EditText) { 
      //validate your EditText here 
     } else if (v instanceof RadioButton) { 
      //validate RadioButton 
     } //etc. If it fails anywhere, just return false. 
    } 
    return true; 
} 
+0

Me gusta el uso de getClass. Supongo que en una tabla o similar tipo de contenedor de visitas se podría usar una llamada recursiva para recoger también a esos niños internos, ¿verdad? – Lumis

+1

¡Buena pregunta! Yo pensaría que sí. Supongo que puede hacer que la función formValid tome un parámetro de vista genérico y emitir, para que pueda hacer algo como 'if (c == TableLayout.class) if (! FormIsValid (v)) return false;'. Tendrías que asegurarte de no solo regresar verdadero después del diseño anidado para evitar abandonar antes de terminar el resto del formulario original. – kcoppock

+0

Ese es precisamente mi caso, getChildAt() devuelve solo las tablas. – xain

0

Su onClickListener suministra el objeto View v; use View rV = v.getRootView() para posicionarse en el formulario. Luego, use rV.findViewWithTag(...) o rV.findViewByID(R.id. ...) para ubicar los elementos de su formulario.

+1

Gracias por su respuesta, pero no tiene que haber una manera más "general". Algo así como "iterar a través de todos los elementos de la vista que son de tipo TextView". – xain

+0

Pensé eso también pero en vano ... – gssi

14

para aplicar el método por el kcoppock de forma recursiva, puede cambiarlo a esto:

private void loopViews(ViewGroup view) { 
    for (int i = 0; i < view.getChildCount(); i++) { 
     View v = view.getChildAt(i); 

     if (v instanceof EditText) { 
      // Do something 

     } else if (v instanceof ViewGroup) { 

      this.loopViews((ViewGroup) v); 
     } 
    } 
} 
Cuestiones relacionadas