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?

Adham
la source

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

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

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