Ottieni tutte le visualizzazioni figlio all'interno di LinearLayout in una volta


140

Ho un LinearLayout, che contiene diversi bambini TextViews. Come posso ottenere viste figlio di quel LinerLayout usando un loop?

Risposte:


282

Usa getChildCount()e getChildAt(int index).

Esempio:

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

Ciao Yashwanth Kumar, posso ottenere tutte le visualizzazioni di testo in quel Linearlayout?
Hai nguyen,

15
@ hai-nguyen: puoi usare if (v instanceof TextView) {...} per questo.
Anoop,

3
cosa succede se uno dei bambini è un ViewGroup e vogliamo ottenere anche tutti quei bambini?
Hendra Anggrian,

Come posso ottenere il totale no di buttonsaggiunto nel layout lineare e dividerlo per 2 ? Il mio scopo è mostrare 2 file di pulsanti usando un layout lineare .
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.

Qui sto ripetendo solo EdiTexts, se vuoi tutte le viste puoi sostituire EditText con 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);
        }
    }
}

Giusto per chiarire, farlo in modo ricorsivo è perché getChildAtrestituisce solo bambini diretti
YoussefDir

4

Usa questo

    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

È più facile con Kotlin usare il ciclo for-in:

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

Qui llè iddi LinearLayoutdefinito nel layout XML.


1

Ottieni tutte le visualizzazioni da qualsiasi tipo di 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;
}

Ottieni tutto TextView da qualsiasi tipo di 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;
}

-1

Ottieni tutte le viste di una vista più i suoi figli in modo ricorsivo a 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)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.