2010-04-08 8 views
24

Pracuję nad grą dla systemu Android. Aby pomóc w jego realizacji, moim pomysłem jest stworzenie podklasy widoku. Następnie wstawiłbym kilka wystąpień tej klasy jako dzieci głównego widoku. Każda instancja poradziłaby sobie z wykrywaniem, kiedy została naciśnięta (za pomocą OnTouchListener).Pętla przez wszystkie subviews widoku Androida?

Problem, który mam teraz, polega na tym, w jaki sposób przechodzę przez te wszystkie podstrony, aby móc odczytać ich statusy i przetworzyć je? (Tj. Gdy wszyscy osiągną pewien stan, coś powinno się wydarzyć).

A może jest lepszy sposób na wyświetlanie na ekranie kilku obiektów reagujących na dotyk i których status mogę sprawdzić?

Odpowiedz

17

@jqpubliq ma rację, ale jeśli naprawdę chce przejść przez wszystkie widoki można po prostu użyć metod getChildCount() i getChildAt() z ViewGroup. Prosta metoda rekurencyjna zajmie się resztą.

1

Korzystanie z Views brzmi, jak trudno będzie oddać cokolwiek, jeśli jest ruch. Prawdopodobnie chcesz rysować na Canvas lub używając OpenGL, chyba że robisz coś naprawdę statycznego. Oto great talk z ubiegłorocznej konferencji I/O na temat tworzenia gier na Androida. Jego rodzaj długi i można pominąć około 15 minut w. Również źródło jest dostępne. To powinno dać dobry pomysł sposobów, aby przejść o rzeczach

+0

Tak, potrzebowałem zrobić to inaczej, ale najpierw spróbuję tego. To zwykła gra. – Slapout

41

Zrobiłem mały przykład funkcji rekurencyjnej:

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

Funkcja rozpocznie zapętlenie nad al wyświetlanie elementów wewnątrz viewgroup (z ostatniego do pierwszego elementu), jeśli dziecko jest viewgroup następnie uruchom funkcja z tym dzieckiem, aby pobrać wszystkie zagnieżdżone widoki wewnątrz tego dziecka.

+0

nie działa. gdy widok zawiera webView – Karacago

+2

Każdy szczególny powód, dla którego wybrałeś 'for (int i = parent.getChildCount() - 1; i> = 0; i -)' zamiast 'for (int i = 0; i

+0

@PeterProkop Ja osobiście lubię tę pętlę więcej. Działa dobrze, nawet jeśli usuniesz jeden z elementów pętli podczas pętli. –

0

Dlaczego po prostu nie używać tablicy lub wektora, aby śledzić te widoki? To byłby najprostszy i najbardziej efektywny sposób, jaki myślę.