Obter todas as visualizações filho dentro do LinearLayout de uma só vez

140

Eu tenho um LinearLayout, que contém vários filhos TextViews. Como posso obter visualizações filho desse LinerLayout usando um loop?

Adham
fonte

Respostas:

282

Use getChildCount()e getChildAt(int index).

Exemplo:

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
fonte
Olá Yashwanth Kumar, posso obter todos os TextViews nesse Linearlayout?
Hai nguyen
15
@ hai-nguyen: Você pode usar if (v instanceof TextView) {...} para isso.
Anoop 04/04
3
e se uma criança é um ViewGroup e também queremos receber todas essas crianças?
Hendra Anggrian
Como posso obter o número total de buttonsadicionado no layout linear e dividi-lo por 2 ? Meu objetivo é mostrar 2 linhas de botões usando o layout linear .
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.

Aqui estou iterando apenas o EdiTexts, se você quiser todas as Views, poderá substituir EditText por View.

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
fonte
Só para esclarecer, fazê-lo recursivamente é porque getChildAtretorna apenas filhos diretos
YoussefDir
4

usa isto

    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()));
        }

    }
Роман Зыков
fonte
3

É mais fácil com o Kotlin usando o loop for-in:

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

Aqui llé idde LinearLayoutdefinido em XML layout.

Malwinder Singh
fonte
1

Obtenha todas as visualizações de qualquer tipo de layout

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;
}

Obtenha todo o TextView de qualquer tipo de layout

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
fonte
-1

Obtenha todas as visualizações de uma visualização e seus filhos recursivamente no 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
fonte