Uzyskaj wszystkie widoki podrzędne w LinearLayout jednocześnie

140

Mam LinearLayout, który zawiera kilka dzieci TextViews. Jak uzyskać widoki podrzędne tego układu LinerLayout za pomocą pętli?

Adham
źródło

Odpowiedzi:

282

Użyj getChildCount()i getChildAt(int index).

Przykład:

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
źródło
Cześć Yashwanth Kumar, czy mogę uzyskać wszystkie TextViews w tym Linearlayout?
Hai nguyen,
15
@ hai-nguyen: Możesz użyć do tego if (v instanceof TextView) {...}.
Anoop
3
co jeśli jedno z dzieci należy do ViewGroup i chcemy mieć również wszystkie te dzieci?
Hendra Anggrian
Jak mogę uzyskać całkowitą liczbę buttonsdodanych w układzie liniowym i podzielić ją przez 2 ? Moim celem jest pokazanie 2 rzędów przycisków w układzie liniowym .
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.

Tutaj iteruję tylko EdiTexts, jeśli chcesz wszystkie widoki, możesz zastąpić EditText widokiem.

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
źródło
Dla wyjaśnienia, robienie tego rekurencyjnie jest spowodowane tym, że getChildAtzwraca tylko bezpośrednie dzieci
YoussefDir
4

Użyj tego

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

    }
Роман Зыков
źródło
3

Z Kotlin jest łatwiej, używając pętli for-in:

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

Tutaj lljest idz LinearLayoutdefinicją zawartą w układzie XML.

Malwinder Singh
źródło
1

Uzyskaj wszystkie widoki z dowolnego typu układu

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

Uzyskaj cały TextView z dowolnego typu układu

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
źródło
-1

Uzyskaj rekursywnie wszystkie widoki widoku i jego elementy podrzędne w Kotlinie:

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
źródło