Obtenez toutes les vues enfants dans LinearLayout à la fois


140

J'ai un LinearLayout, qui contient plusieurs enfants TextViews. Comment puis-je obtenir des vues enfants de ce LinerLayout à l'aide d'une boucle?

Réponses:


282

Utilisez getChildCount()et getChildAt(int index).

Exemple:

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

Salut Yashwanth Kumar, puis-je obtenir tous les TextViews dans ce Linearlayout?
Hai nguyen

15
@ hai-nguyen: Vous pouvez utiliser if (v instanceof TextView) {...} pour cela.
Anoop le

3
Et si l'un des enfants est un ViewGroup et que nous voulons également obtenir tous ces enfants?
Hendra Anggrian

Comment puis-je obtenir le nombre total d' buttonsajoutés dans une mise en page linéaire et le diviser par 2 ? Mon but est d'afficher 2 rangées de boutons en utilisant une disposition linéaire .
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.

Ici, je n'itère que les EdiTexts, si vous voulez toutes les vues, vous pouvez remplacer EditText par 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);
        }
    }
}

Juste pour clarifier, le faire de manière récursive est parce getChildAtque ne renvoie que les enfants directs
YoussefDir

4

utilisez ceci

    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

C'est plus facile avec Kotlin en utilisant la boucle for-in:

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

Voici llest idde LinearLayoutdéfinir en XML de mise en page.


1

Obtenez toutes les vues de tout type de mise en page

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

Obtenez tout TextView de n'importe quel type de mise en page

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

Obtenez toutes les vues d'une vue et de ses enfants de manière récursive dans 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)
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.