Учитывая вид, как я могу получить дочерние виды внутри него?
Так что у меня есть пользовательский вид и отладчик показывает, что под ним mChildren
есть еще 7 видов. Мне нужен способ доступа к этим представлениям, но, похоже, для этого нет общедоступного API.
какие-либо предложения?
РЕДАКТИРОВАТЬ:
Мой пользовательский вид наследуется от AdapterView
viewGroup
Если вы хотите не только получить всех прямых детей, но и всех детей и т. Д., Вы должны сделать это рекурсивно:
Чтобы использовать результат, вы можете сделать что-то вроде этого:
источник
for (int i = 0, n = vg.getChildCount(); i < n; i++)
на Android, доступ к локальным переменным вместо вызова метода, как правило, происходит намного быстрее. Таким образом, метод вызывается только один раз для каждой группы представлений, а затем при последующих запусках используется локальная переменная.Вы всегда можете получить доступ к дочерним представлениям через View.findViewById () http://developer.android.com/reference/android/view/View.html#findViewById(int ).
Например, в деятельности / представлении:
или если у вас есть ссылка на представление:
источник
Я просто собираюсь предоставить этот ответ в качестве альтернативного рекурсивного алгоритма @ IHeartAndroid для обнаружения всех дочерних элементов
View
в иерархии представлений. Обратите внимание, что на момент написания этой статьи рекурсивное решение имеет недостатки, поскольку оно содержит дубликаты в своем результате.Для тех, у кого проблемы с рекурсией, есть нерекурсивная альтернатива. Вы получаете бонусные баллы за то, что поняли, что это также альтернатива поиска в ширину по сравнению с рекурсивным решением, основанным на глубине .
Пара быстрых тестов (ничего формального) предполагает, что эта альтернатива также быстрее, хотя это, скорее всего, связано с количеством новых
ArrayList
экземпляров, создаваемых другим ответом. Кроме того, результаты могут отличаться в зависимости от вертикальной / горизонтальной иерархии представления.Кросс-пост от: Android | Получить все дочерние элементы ViewGroup
источник
Вот предложение: вы можете получить
ID
(указанный, например,android:id="@+id/..My Str..
), который был сгенерированR
, используя его имя (напримерMy Str
). Фрагмент кода с использованиемgetIdentifier()
метода будет:Изнутри
Activity
, пример использования в сочетании сfindViewById
:источник
В качестве обновления для тех, кто сталкивается с этим вопросом после 2018 года, если вы используете Kotlin, вы можете просто использовать свойство расширения Android KTX ViewGroup.children, чтобы получить последовательность непосредственных потомков представления.
источник
Чтобы обновить макет таблицы (TableLayout), мне пришлось использовать рекурсивный подход, упомянутый выше, чтобы получить всех детей детей и так далее.
Моя ситуация несколько упростилась, потому что мне нужно было работать только с LinearLayout и теми классами, расширенными из него, как TableLayout. И мне было интересно только найти детей TextView. Но я думаю, что это все еще применимо к этому вопросу.
Последний класс запускается как отдельный поток, что означает, что он может выполнять другие действия в фоновом режиме перед синтаксическим анализом для детей. Код небольшой и простой, его можно найти на github: https://github.com/jkincali/Android-LinearLayout-Parser
источник
Этот метод берет все виды внутри макета, это похоже на ответ Александра Куляхтина. Разница в том, что он принимает любой тип родительских макетов и возвращает список массивов представлений.
источник