Dapatkan semua tampilan anak di dalam LinearLayout sekaligus

140

Saya punya LinearLayout, yang berisi beberapa anak TextViews. Bagaimana saya bisa mendapatkan pandangan anak tentang LinerLayout menggunakan loop?

Adham
sumber

Jawaban:

282

Gunakan getChildCount()dan getChildAt(int index).

Contoh:

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
sumber
Hai Yashwanth Kumar, bisakah saya mendapatkan semua TextViews di Linearlayout itu?
Hai nguyen
15
@ hai-nguyen: Anda dapat menggunakan if (v instanceof TextView) {...} untuk itu.
Anoop
3
bagaimana jika salah satu anak adalah ViewGroup dan kami ingin mendapatkan semua anak itu juga?
Hendra Anggrian
Bagaimana saya bisa mendapatkan total no yang buttonsditambahkan dalam tata letak linier dan membaginya dengan 2 ? Tujuan saya adalah untuk menunjukkan 2 baris tombol menggunakan tata letak linier .
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.

Di sini saya hanya mengulangi EdiTexts, jika Anda menginginkan semua Tampilan, Anda dapat mengganti EditText dengan 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
sumber
Hanya untuk memperjelas, melakukannya secara rekursif adalah karena getChildAthanya mengembalikan anak
YoussefDir
4

Gunakan ini

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

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

Lebih mudah dengan Kotlin menggunakan for-in loop:

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

Berikut lladalah iddari LinearLayoutyang ditetapkan dalam tata letak XML.

Malwinder Singh
sumber
1

Dapatkan semua tampilan dari semua jenis tata letak

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

Dapatkan semua TextView dari semua jenis tata letak

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
sumber
-1

Dapatkan semua tampilan pemandangan dan anak-anaknya secara rekursif di 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
sumber