Obtenga todas las vistas secundarias dentro de LinearLayout a la vez


140

Tengo un LinearLayout, que contiene varios hijos TextViews. ¿Cómo puedo obtener vistas secundarias de ese LinerLayout usando un bucle?

Respuestas:


282

Uso getChildCount()y getChildAt(int index).

Ejemplo:

LinearLayout ll = 
final int childCount = ll.getChildCount();
for (int i = 0; i < childCount; i++) {
      View v = ll.getChildAt(i);
      // Do something with v.
      // …
}

Hola Yashwanth Kumar, ¿puedo obtener todas las vistas de texto en ese Linearlayout?
Hai nguyen

15
@ hai-nguyen: puede usar if (v instanceof TextView) {...} para eso.
Anoop

3
¿Qué pasa si uno de los niños es un ViewGroup y queremos obtener todos esos niños también?
Hendra Anggrian

¿Cómo puedo obtener el total no buttonsagregado en el diseño lineal y dividirlo en 2 ? Mi propósito es mostrar 2 filas de botones usando un diseño lineal .
Jay Rathod RJ

39
((ViewGroup) findViewById(android.R.id.content));// you can use this in an Activity to get your layout root view, then pass it to findAllEdittexts() method below.

Aquí estoy iterando solo EdiTexts, si desea todas las Vistas, puede reemplazar EditText con Vista.

SparseArray<EditText> array = new SparseArray<EditText>();

private void findAllEdittexts(ViewGroup viewGroup) {

    int count = viewGroup.getChildCount();
    for (int i = 0; i < count; i++) {
        View view = viewGroup.getChildAt(i);
        if (view instanceof ViewGroup)
            findAllEdittexts((ViewGroup) view);
        else if (view instanceof EditText) {
            EditText edittext = (EditText) view;
            array.put(editText.getId(), editText);
        }
    }
}

Solo para aclarar, hacerlo de forma recursiva se debe a que getChildAtsolo devuelve hijos directos
YoussefDir

4

utilizar este

    final int childCount = mainL.getChildCount();
    for (int i = 0; i < childCount; i++) {
          View element = mainL.getChildAt(i);

        // EditText
        if (element instanceof EditText) {
            EditText editText = (EditText)element;
            System.out.println("ELEMENTS EditText getId=>"+editText.getId()+ " getTag=>"+element.getTag()+
            " getText=>"+editText.getText());
        }

        // CheckBox
        if (element instanceof CheckBox) {
            CheckBox checkBox = (CheckBox)element;
            System.out.println("ELEMENTS CheckBox getId=>"+checkBox.getId()+ " getTag=>"+checkBox.getTag()+
            " getText=>"+checkBox.getText()+" isChecked=>"+checkBox.isChecked());
        }

        // DatePicker
        if (element instanceof DatePicker) {
            DatePicker datePicker = (DatePicker)element;
            System.out.println("ELEMENTS DatePicker getId=>"+datePicker.getId()+ " getTag=>"+datePicker.getTag()+
            " getDayOfMonth=>"+datePicker.getDayOfMonth());
        }

        // Spinner
        if (element instanceof Spinner) {
            Spinner spinner = (Spinner)element;
            System.out.println("ELEMENTS Spinner getId=>"+spinner.getId()+ " getTag=>"+spinner.getTag()+
            " getSelectedItemId=>"+spinner.getSelectedItemId()+
            " getSelectedItemPosition=>"+spinner.getSelectedItemPosition()+
            " getTag(key)=>"+spinner.getTag(spinner.getSelectedItemPosition()));
        }

    }

3

Con Kotlin es más fácil usar el bucle for-in:

for (childView in ll.children) {
     //childView is a child of ll         
}

Aquí lles iddel LinearLayoutdefinido en XML diseño.


1

Obtenga todas las vistas desde cualquier tipo de diseño

public List<View> getAllViews(ViewGroup layout){
        List<View> views = new ArrayList<>();
        for(int i =0; i< layout.getChildCount(); i++){
            views.add(layout.getChildAt(i));
        }
        return views;
}

Obtenga todo TextView desde cualquier tipo de diseño

public List<TextView> getAllTextViews(ViewGroup layout){
        List<TextView> views = new ArrayList<>();
        for(int i =0; i< layout.getChildCount(); i++){
            View v =layout.getChildAt(i);
            if(v instanceof TextView){
                views.add((TextView)v);
            }
        }
        return views;
}

-1

Obtenga todas las vistas de una vista más sus hijos de forma recursiva en Kotlin:

private fun View.getAllViews(): List<View> {
    if (this !is ViewGroup || childCount == 0) return listOf(this)

    return children
            .toList()
            .flatMap { it.getAllViews() }
            .plus(this as View)
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.