Holen Sie sich alle untergeordneten Ansichten in LinearLayout auf einmal

140

Ich habe eine LinearLayout, die mehrere Kinder enthält TextViews. Wie kann ich mithilfe einer Schleife untergeordnete Ansichten dieses LinerLayout abrufen?

Adham
quelle

Antworten:

282

Verwenden Sie getChildCount()und getChildAt(int index).

Beispiel:

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
quelle
Hallo Yashwanth Kumar, kann ich alle Textansichten in diesem linearen Layout erhalten?
Hai Nguyen
15
@ hai-nguyen: Sie können if (v Instanz von TextView) {...} dafür verwenden.
Anoop
3
Was ist, wenn eines der Kinder eine ViewGroup ist und wir auch all diese Kinder haben möchten?
Hendra Anggrian
Wie kann ich die Gesamtzahl der buttonsim linearen Layout hinzugefügten Elemente durch 2 aufteilen lassen ? Mein Zweck ist es, 2 Reihen von Schaltflächen mit linearem Layout anzuzeigen .
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.

Hier iteriere ich nur EdiTexts. Wenn Sie alle Ansichten möchten, können Sie EditText durch Ansicht ersetzen.

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
quelle
Nur um zu verdeutlichen, ist es rekursiv, weil getChildAtnur direkte Kinder zurückgegeben werden
YoussefDir
4

benutze das

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

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

Mit Kotlin ist es einfacher, eine For-In-Schleife zu verwenden:

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

Hier llist iddie LinearLayoutin Layout XML definiert.

Malwinder Singh
quelle
1

Holen Sie sich alle Ansichten aus jeder Art von 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;
}

Holen Sie sich alle TextView aus jeder Art von 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
quelle
-1

Holen Sie sich alle Ansichten einer Ansicht und ihrer Kinder rekursiv in 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
quelle