Перебрать все подпредставления представления Android? - PullRequest
30 голосов
/ 08 апреля 2010

Я работаю над игрой для Android. Чтобы помочь реализовать его, моя идея заключается в создании подкласса представления. Затем я бы вставил несколько экземпляров этого класса в качестве потомков основного вида. Каждый экземпляр будет обрабатывать обнаружение, когда он был нажат (через OnTouchListener).

Проблема, с которой я сейчас сталкиваюсь, заключается в том, как мне пройти через все эти подвиды, чтобы я мог прочитать их состояния и обработать их? (Т.е. когда они все достигнут определенного состояния, что-то должно произойти).

Или есть ли лучший способ иметь на экране несколько объектов, которые реагируют на прикосновения и чей статус я могу проверить?

Ответы [ 4 ]

54 голосов
/ 24 сентября 2013

Я сделал небольшой пример рекурсивной функции:

public void recursiveLoopChildren(ViewGroup parent) {
        for (int i = 0; i < parent.getChildCount(); i++) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                recursiveLoopChildren((ViewGroup) child);
                // DO SOMETHING WITH VIEWGROUP, AFTER CHILDREN HAS BEEN LOOPED
            } else {
                if (child != null) {
                    // DO SOMETHING WITH VIEW
                }
            }
        }
    }

Функция начнет цикл по всем элементам представления внутри ViewGroup (от первого до последнего элемента), если дочерний элемент являетсяViewGroup затем перезапустите функцию с этим потомком, чтобы получить все вложенные представления внутри этого потомка.

20 голосов
/ 08 апреля 2010

@ jqpubliq Верно, но если вы действительно хотите просмотреть все представления, вы можете просто использовать методы getChildCount() и getChildAt() из ViewGroup. Простой рекурсивный метод сделает все остальное.

1 голос
/ 08 апреля 2010

Использование Views звучит так, как будто будет очень трудно хорошо отрисовать что-либо, если есть движение.Вы, вероятно, хотите рисовать на Canvas или использовать OpenGL, если вы не делаете что-то действительно статичное.Вот отличный разговор с прошлой конференции ввода / вывода по созданию игр для Android.Это довольно долго, и вы можете пропустить около 15 минут. Также источник доступен.Это должно дать вам хорошее представление о том, как действовать

0 голосов
/ 14 июня 2019

Альтернатива

public static void recursivelyFindChildren(View view) {
    if (view instanceof ViewGroup) {
        //ViewGroup
        ViewGroup viewGroup = (ViewGroup)view;

        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            recursivelyFindChildren(viewGroup.getChildAt(i));
        }

    } else {
        //View
    }

}

Или вы можете вернуть что-то, что можно использовать следующим подходом

@Nullable
private static WebView recursivelyFindWebView(View view) {
    if (view instanceof ViewGroup) {
        //ViewGroup
        ViewGroup viewGroup = (ViewGroup)view;

        if (!(viewGroup instanceof WebView)) {
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                WebView result = recursivelyFindWebView(viewGroup.getChildAt(i));

                if (result != null) {
                    return result;
                }
            }
        } else {
            //WebView

            WebView webView = (WebView)viewGroup;
            return webView;
        }

    }

    return null;
}
...