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?

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.
      // …
}

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

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

    }

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.


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

-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)
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.