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?

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

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

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

    }

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.


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

-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)
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.