Método para obtener todos los EditTexts en una vista

¿Puede alguien ayudarme con la codificación de un método para obtener todos EditTexts en una vista? Me gustaría implementar la solución htafoya publicado aquí: ¿Cómo ocultar el teclado virtual en Android después de hacer clic fuera de EditText?

Desafortunadamente, el método getFields() falta y htafoya no respondió a nuestra solicitud para compartir su método getFields() .

EDITAR

MByD me señaló un error, haciendo mi respuesta casi idéntica a la del blackbelt. He editado el mío con el enfoque correcto.


Podría hacer un bucle for-each y luego comprobar si cada vista es del tipo EditText:

 ArrayList<EditText> myEditTextList = new ArrayList<EditText>(); for( int i = 0; i < myLayout.getChildCount(); i++ ) if( myLayout.getChildAt( i ) instanceof EditText ) myEditTextList.add( (EditText) myLayout.getChildAt( i ) ); 

También puede, en lugar de tener una lista de EditTexts, tiene una lista de ID's y luego simplemente agregue el id del niño a la lista: myIdList.add( child.getId() );


Para tener acceso a su disposición usted necesita conseguir una referencia para ella. Esto significa que debe proporcionar un ID para su diseño en su XML:

 <LinearLayout android:id="@+id/myLinearLayout" > //Here is where your EditTexts would be declared </LinearLayout> 

A continuación, cuando infle el diseño en su actividad sólo asegúrese de guardar una referencia a ella:

 LinearLayout myLinearLayout; public void onCreate( Bundle savedInstanceState ) { super( savedInstanceState ); setContentView( R.layout.myLayoutWithEditTexts ); ... myLinearLayout = (LinearLayout) findViewById( R.id.myLinearLayout ); } 

A continuación, tiene una referencia a su titular de su EditTexts dentro de la actividad.

Aquí está un método que escribí recursivamente para comprobar todos los niños EditText de un ViewGroup, útil para una forma de inscripción largo que tenía que hacer y probablemente más fácil de mantener.

 private EditText traverseEditTexts(ViewGroup v) { EditText invalid = null; for (int i = 0; i < v.getChildCount(); i++) { Object child = v.getChildAt(i); if (child instanceof EditText) { EditText e = (EditText)child; if(e.getText().length() == 0) // Whatever logic here to determine if valid. { return e; // Stops at first invalid one. But you could add this to a list. } } else if(child instanceof ViewGroup) { invalid = traverseEditTexts((ViewGroup)child); // Recursive call. if(invalid != null) { break; } } } return invalid; } private boolean validateFields() { EditText emptyText = traverseEditTexts(mainLayout); if(emptyText != null) { Toast.makeText(this, "This field cannot be empty.", Toast.LENGTH_SHORT).show(); emptyText.requestFocus(); // Scrolls view to this field. } return emptyText == null; } 

Puede hacerlo llamando a View#getFocusables , que devolverá un arraylist de todas las vistas que se pueden enfocar en una Vista.

A continuación, puede comprobar si son EditText s, con ( instanceof ) o actuar en todos ellos.

Este método se recorre recursivamente a través de todos los ViewGroups y recoge sus TextViews. Yo uso esto para asignar un nuevo color a todos los TextViews (incluso aquellos incrustados en widgets predefinidos como Switch, etc que hacen uso de TextViews)

 private HashSet<TextView> getTextViews(ViewGroup root){ HashSet<TextView> views=new HashSet<>(); for(int i=0;i<root.getChildCount();i++){ View v=root.getChildAt(i); if(v instanceof TextView){ views.add((TextView)v); }else if(v instanceof ViewGroup){ views.addAll(getTextViews((ViewGroup)v)); } } return views; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.