2012-02-01 25 views
7

Pierwsze pytanie na przepełnienie stosu, przepraszam, jeśli nie jest dobrze uformowane.Android - jak zrobić złożoną aplikację z zakładkami z widokami

Pracuję nad stosunkowo złożoną aplikacją z kartami, która już zawiera podstawowe informacje, zanim przejdzie do informacji, że ActivityGroup i TabActivity są przestarzałe, a preferowanym modelem jest używanie widoków.

Nie miałem problemów z wykorzystaniem widoków, to jest pytanie o architekturę zamiast składni (dlatego nie opublikowałem żadnego kodu). W szczególności, , w jaki sposób powinienem przejść do restrukturyzacji aplikacji, aby korzystać z widoków zamiast Intent uruchomionych działań.

Aplikacja ma pięć zakładek; dwa posiadają jeden układ, nie ma problemu. Pozostałe trzy zakładki uruchamiają grupę Activity z 2-5 różnymi Aktywnościami (tj. Zakładką uruchamiającą działanie dla ustawień, gdzie kliknięcie każdego z podglądów rozpoczyna nową Czynność zajmującą to konkretne ustawienie, naciśnięcie przycisku Wstecz powoduje powrót do szerszych ustawień aktywność/widok). Gdybym miał zachować każdą kartę jako TabActivity, nadal byłoby dość łatwo zmienić te wewnętrzne przejścia na widoki, a nie osobne Działania.

Głównym pytaniem jest użycie TYLKO widoków, bez grupy TabActivity/Activity. Ogromna większość badań, które przeprowadziłem, była dyskusja o tym, czy używać działań lub widoków, czy o określonej składni. Nie byłem w stanie zebrać jasnego pomysłu, jak faktycznie przejść do widoków w całej aplikacji.

  1. Gdybym miał to zrobić, nie cała aplikacja teraz być uruchomiony w jednym aktywny - jeden gospodarzem kartach układ?

  2. Jeśli (1) jest prawdziwe, jak to zrobić? Pomimo wycofania ActivityGroup, cała dokumentacja Androida nadal wydaje się stwierdzać, że preferowane jest używanie oddzielnych działań dla osobnych aspektów funkcjonalności - co ma sens. Czy zespół programistów Androida po prostu zdecydował, że koszty związane ze stosem i urządzeniem uniemożliwiły wdrożenie TabActivity?

  3. Jeśli aplikacja działa w jednym działaniu, które zarządza różnymi widokami dla każdej karty (a następnie różnymi widokami W ZAKRESIE karty), czy powinienem mieć jedną ogromną metodę onClick do obsługi wszystkich kliknięć z dowolnego klikalnego widoku, obsługa danych wejściowych na podstawie tego, który widok jest aktywny? Czy powinienem programowo zarejestrować i wyrejestrować wszystkich moich Słuchaczy?

  4. Czy podczas pojedynczej aktywności żaden odbiornik kliknięcia ani żaden odbiornik nie będą działać przez cały czas, pochłaniając zasoby nawet wtedy, gdy niepotrzebne?

  5. Po naciśnięciu jednego przycisku przycisk Wstecz spowoduje zamknięcie całej aplikacji z dowolnego miejsca w jej funkcjonalności. Jeśli używam widoków, czy nie muszę konsekwentnie zastępować onBackPressed() i ostrożnie zarządzać zachowaniem aplikacji, aby zmusić ją do zachowania "jak aplikacja dla systemu Android?"

  6. AM MYŚLĘ O TYM CAŁKOWICIE NIEPRAWIDŁOWY? Możliwe, że nieumyślnie próbuję odtworzyć funkcjonalność ActivityGroup i TabActivity, korzystając z widoków, kiedy powinienem przyjmować całkowicie odmienne podejście do korzystania z kart i widoków.

Kiedy ludzie w Google powiedzieć, że nie należy korzystać z działalności prowadzonej na kartach już i pan Mark Murphy więc zdecydowanie zgadza się, jestem skłonny uwierzyć.Po prostu nie udało mi się znaleźć sposobu na zmianę, bez konieczności ręcznego odtwarzania wielu funkcji aktywności (co prawdopodobnie zawierałoby wiele brudnych hacków).

Docenianie z góry dla każdego, kto chce rozwiązać ten niejasny i nadpisany temat.

+1

naprawdę doskonałe pytanie ... witamy w Stack. –

Odpowiedz

2

Jest to nowy standard wykonywania elementów interfejsu użytkownika z zakładkami, myślę, że musiałaś je przeoczyć, ponieważ są brakującym elementem we wszystkich powyższych pytaniach. Powodzenia.

Nie zapominaj, że korzystanie z biblioteki zgodności powoduje, że Fragment obsługuje aż do wersji 1.6.

I here jest łatwym polecanym przez Google samouczkiem dotyczącym używania fragmentów w TabHost.

+0

Masz rację, Zupełnie przeoczyłem fragmenty. Bardzo pomocna, dziękuję. – HeMightBeTodd

+0

@HendlerExploit, jeśli dobrze rozumiem dokumentację fragmentu, nie chcemy używać oddzielnych działań dla każdej karty, ale * IS * uważa się za dobry projekt użycie oddzielnych fragmentów dla każdego osobnego składnika funkcjonalności? – HeMightBeTodd

+0

Poprawnie, Fragmenty można traktować jako grupę podstawowych elementów logicznych. W odróżnieniu od działania, ale z Fragmentami możesz ograniczyć duplikację kodu, wykorzystując te same Fragmenty w różnych miejscach. – HandlerExploit

1

Informacje o 3) Podziel aplikację na tylu zajęciach, w których masz różne części aplikacji. Dzisiaj chodziłem nawet do Frigate, które można łatwiej komponować z różnymi układami, gdy np. zrób aplikację na telefon i tablet. Większość czasu, można po prostu skonfigurować onClick słuchaczy w odpowiednich plikach definicji układ xml tak:

<ImageButton 
    android:id="@+id/new_tweet_back_button" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_gravity="left" 
    android:onClick="done" 
    android:src="@drawable/back_button" 
    android:layout_below="@id/CharCount" 
     /> 

tu punkty atrybutów do metody, która implementuje obsługi. Nie musisz niczego rejestrować.

I zamiast Tabs pójdę do ViewPager co sprawia imo znacznie bardziej naturalne doświadczenie z tylko zamiana widoki, przesuwając w lewo i prawo (patrz np G + aplikację lub aplikację rynku)

+0

Przypuszczam, że zostawiłem to z początkowego pytania - ogromna większość moich operacji obsługi kliknięć odbywa się za pomocą metod zadeklarowanych przez android: onClick w układzie xml. W takim przypadku czy detektory są aktywne tylko wtedy, gdy odpowiedni plik został wywołany z setContent() lub setContentView(), tak że nie muszę się martwić inaczej? – HeMightBeTodd

+0

Tak - i można również użyć metody dla wielu elementów interfejsu użytkownika - jako argument przekazywany jest "widok wywołania". –

+0

W tym przypadku, jeśli deklaruję android: onClick = "myClickHandler" w wielu widokach, ten sam myClickHandler (View v) będzie wywoływany przez nich wszystkich, przekazując odpowiedni widok? – HeMightBeTodd

0

Jako ostateczne rozwiązanie moje własne pytanie:

Używanie fragmentów w kartach DID rozwiązać wszystkie powyższe problemy.

Tak więc zamiast zakładek definiujących działanie, które zawierają inne działania, mam jedną dużą funkcję FragmentActivity, która ustawia i przełącza widoki różnych fragmentów. Metody klikania zdefiniowane w XML dla każdego widoku kart należą do FragmentActivity, a ja zdecydowałem się na każde wywołanie onClick odpowiedniej metody w odpowiednim fragmencie (przekazywanie kontekstu, jeśli to konieczne), więc kod do manipulowania każdym widokiem programowo może pozostać w odpowiednia klasa.

TO JEST DLA TELEFONU WYKORZYSTUJĄCEGO PAKIET KOMPATYBILNOŚCI, a nie tablet lub plaster miodu, więc nie mogę mówić za niestety.

To rozwiązanie sprawdziło się dobrze. Polecam każdemu, patrząc w tym samym numerze, aby sprawdzić:

thepsuedocoder blogu: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

Android dokumentacji na fragmentach: http://developer.android.com/guide/topics/fundamentals/fragments.html

Demo API "Fragment karty" http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment

Powiązane problemy