У меня есть кот LinearLayout
, который содержит несколько детей TextViews
. Как я могу получить дочерние представления этого LinerLayout с помощью цикла?
143
У меня есть кот LinearLayout
, который содержит несколько детей TextViews
. Как я могу получить дочерние представления этого LinerLayout с помощью цикла?
Используйте getChildCount()
и getChildAt(int index)
.
Пример:
LinearLayout ll = …
final int childCount = ll.getChildCount();
for (int i = 0; i < childCount; i++) {
View v = ll.getChildAt(i);
// Do something with v.
// …
}
buttons
добавленных в линейном макете и разделить его на 2 ? Моя цель - показать 2 ряда кнопок с использованием линейного макета .((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.
Здесь я повторяю только EdiTexts, если вам нужны все представления, вы можете заменить EditText на 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); } } }
источник
getChildAt
возвращаются только прямые дочерниеиспользовать это
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())); } }
источник
С Kotlin проще использовать цикл for-in:
for (childView in ll.children) { //childView is a child of ll }
Вот
ll
этоid
изLinearLayout
определенных в XML разметки.источник
Получите все виды из любого типа макета
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; }
Получите весь TextView из любого типа макета
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; }
источник
Получите все представления представления плюс его дочерние элементы рекурсивно в 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) }
источник