Подтвердить что ты не робот

Как получить все виды в действии?

Есть ли способ получить каждое представление, которое находится внутри моей активности? У меня более 200 просмотров, включая кнопки и изображения, поэтому я хочу иметь доступ к ним с помощью цикла

например, что-то вроде

for (View v : this)
{
     //do something with the views 
     //depending on the types (button, image , etc)
}
4b9b3361

Ответ 1

есть ли способ получить каждое представление, которое находится внутри моей деятельности?

Получите ваш root View, отбросьте его до ViewGroup, вызовите getChildCount() и getChildAt() и при необходимости перезапустите.

У меня более 200 просмотров, включая кнопок и изображений, поэтому я хочу быть доступ к ним с помощью цикла

Это довольно большое число Views.

Ответ 2

Конкретно:

private void show_children(View v) {
    ViewGroup viewgroup=(ViewGroup)v;
    for (int i=0;i<viewgroup.getChildCount();i++) {
        View v1=viewgroup.getChildAt(i);
        if (v1 instanceof ViewGroup) show_children(v1);
        Log.d("APPNAME",v1.toString());
    }
}

И затем используйте функцию где-нибудь:

show_children(getWindow().getDecorView());

чтобы показать все Представления в текущей Деятельности.

Ответ 3

Попробуйте найти все представления, связанные с Activity.

введите следующую команду.

ViewGroup viewgroup=(ViewGroup)view.getParent();
viewgroup.getchildcount();

повторить цикл.

Мы получим результат.

Ответ 4

Вы можете использовать иерархический просмотр, он позволяет видеть иерархию представлений, в том числе созданные в коде. Основная причина заключается в отладке таких вещей. Последняя Android-студия теперь имеет эту функцию в Device Monitor, которая позволяет вам сделать дамп пользовательского интерфейса для его отладки.

Ответ 5

Хороший способ сделать это в 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)
}