2011-01-26 11 views
52

Ho una vista con radio, ingressi e un pulsante e quando clicco, voglio controllare che tutti gli input contengano informazioni. Come posso scorrere gli elementi della vista nell'attività e controllare se ogni textview soddisfa i requisiti sopra menzionati? Grazie.Come iterare attraverso gli elementi di una vista

risposta

108

che ho fatto qualcosa di simile in un certo codice non ho con me in questo momento, ma dalla memoria dovrebbe essere qualcosa di simile (assumendo una LinearLayout vista padre con un id di "layout"):

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

Mi piace il tuo uso di getClass. Immagino che in una tabella o in una simile vista del tipo di contenitore si possa usare una chiamata ricorsiva per raccogliere anche quei bambini interiori, giusto? – Lumis

+1

Buona domanda! Lo penserei. Suppongo che tu possa fare in modo che la funzione formIsValid prenda un parametro View generico, e cast, in modo che tu possa fare qualcosa come 'if (c == TableLayout.class) if (! FormIsValid (v)) restituisca false;'. Dovresti assicurarti di non restituire true dopo il layout nidificato per evitare di abbandonare prima di completare il resto del modulo originale. – kcoppock

+0

Questo è esattamente il mio caso, getChildAt() restituisce solo i tablerows. – xain

0

Il onClickListener fornisce l'oggetto View v; utilizzare View rV = v.getRootView() per posizionarsi sul modulo. Quindi utilizzare rV.findViewWithTag(...) o rV.findViewByID(R.id. ...) per individuare gli elementi del modulo.

+1

Grazie per la risposta, ma ci deve essere un modo più "generale". Qualcosa come "iterare attraverso tutti gli elementi della vista che sono di tipo TextView". – xain

+0

Ho pensato anche a questo, ma inutilmente ... – gssi

14

per applicare il metodo con kcoppock in modo ricorsivo, è possibile modificarlo a questo:

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); 
     } 
    } 
} 
Problemi correlati