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?

Adham
fuente

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.
      // …
}
Yashwanth Kumar
fuente
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);
        }
    }
}
Favas Kv
fuente
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()));
        }

    }
Роман Зыков
fuente
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.

Malwinder Singh
fuente
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;
}
NJY404
fuente
-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)
}
Stanislav Kinzl
fuente