SMB - Fragmenty Michail Mokkas
Fragmenty Reprezentuje moduł interfejsu zagnieżdżonego w aktywności. Poprzez dodawanie fragmentów można budować interfejs graficzny składający się z wielu sektorów (ang. panes). Zostały wprowadzone wraz z Android 3.0 (API 11). Głównym powodem była szeroka dostępność urządzeń o różnym rozmiarze ekranów (np. tablety). starsze wersje mogą z nich korzystać za pośrednictwem biblioteki: “v4 Support Library” Fragmenty mogą być ponownie wykorzystane w dowolnej liczbie aktywności.
Fragmenty kont. 1 Umożliwiają repozycjonowanie porcji UI w zależności od kształtu/rozmiaru ekranu. source: http://developer.android.com/guide/components/fragments.html
Cykl życiowy fragmentu Fragmenty posiadają własny cykl zyciowy, który jest zależny od cyklu życiowego aktywności, w której są zagnieżdzone. Bardzo podobny do aktywności. Jeżeli zaistniała potrzeba konwersji jakiejś aktywności na fragment, często wystarczy tylko przekopiować kod z poszczególnych metod bez potrzeby jego modyfikacji. Stany w jakich fragment może się znajdować: Resumed - jest widoczny w uruchomionej aktywności Paused - jest widoczny w uruchomionej aktywności ale zgubił focus Stopped - nie widoczny (np. usunięty z aktywności lub aktywność jest także nie widoczna)
Stan fragmentu W razie potrzeby można zapisać stan fragmentu wykorzystując do tego klasę Bundle. Bundle podobnie jak SharedPreferences przyjmuje wartości prymitywne w postaci <klucz,wartość> . Zapisanie stanu fragmentu odbywa się poprzez wykorzystanie metody: onSaveInstanceState(). Odczytanie stanu fragmentu odbywa się tak jak w aktywności, poprzez przekazanie bundle’a odpowiedniej metodzie (np. onCreate dla aktywności, w przypadku fragmentu onCreateView). Uwaga mechanizm ten wykorzystywany jest jedynie dla danych tymczasowych. Aby trwale zapisać dane, powinniśmy wykorzystać np. SharedPreferences.
Cykl życiowy fragmentu kont. 1 onAttach(Context) – wywołana, kiedy następuje powiązanie fragmentu z aktywnością. onCreate(Bundle) – wywołana, kiedy następuje tworzenie fragmentu. onCreateView(LayoutInflater, ViewGroup, Bundle) – tworzy i zwraca hierarchię widoków powiązanych z fragmentem. onActivityCreated(Bundle) – powiadamia fragment o wykonaniu metody onCreate() powiązanej aktywności. onViewStateRestored(Bundle) – wywołana kiedy wszystkie zapisane stany z hierarchii widoków zostały odtworzone.
Cykl życiowy fragmentu kont. 2 onStart() – czyni fragment widoczny dla użytkownika. Pod warunkiem, że metoda onStart() aktywności też została wykonana. onResume() – sprawia, że interakcja użytkownika z fragmentem zostaje umożliwiona. Pod warunkiem, że metoda onResume () aktywności też została wykonana. onPause() – sprawia, że interakcja użytkownika z fragmentem zostaje uniemożliwiona. Powodem może być wykonanie metody onPause() aktywności lub modyfikacja samego fragmentu w aktywności. onStop() – czyni fragment niewidoczny dla użytkownika. Przyczyną może być zatrzymanie powiązanej aktywności lub modyfikacja samego fragmentu.
Cykl życiowy fragmentu kont. 3 onDestroyView() – umożliwia wyczyszczenie przez fragment zasobów powiązanych z jego widokiem. onDestroy() – wywołana w celu ostatecznego wyczyszczenia stanu fragmentu. onDetach() – wywołana tuż przed utratą powiązania fragmentu z daną aktywnością.
Rodzaje fragmentów Fragment – podstawowa klasa reprezentująca fragment. Podklasy Fragment: DialogFragment – wyświetla dialog. Służy jako alternatywa dialogów aktywności. Można dodawać do back stacku (użytkownik może powracać do nich). ListFragment – wyświetla listę elementów zarządzanych przez adapter (podobnie do ListActivity). Dysponuje metodami do zarządzania widokami listy (np. ListView) PreferenceFragment – wyświetla listę z preferencjami (podobnie jak PreferenceActivity).
Fragment (kod) - dynamicznie LayoutInflater – ustala układ z pliku XML do poszczególnego obiektu View. Do otrzymania obiektu typu LayoutInflater wykorzystywana jest metoda getLayoutInflater(). inflate(int, ViewGroup, Boolean) – ustala hierarchię układów z pliku XML. Argument boolowski wskazuje, czy fragment powinien być dodany do hierarchii widoku ViewGroup.
Fragment (layout)
Dodawanie fragmentu do aktywności (statycznie) android:layout_weight - ustala proporcje ekranowe (np. jeżeli mamy drugi fragment, który posiada wartość 4 to wtedy pierwszy zajmuje 1/5 a drugi 4/5 ekranu). Musi być ustalony dla wysokości lub szerokości (wtedy jeden z nich ma wartość 0).
Komunikacja pomiędzy Activity - Fragment Z poziomu fragmentu: getActivity() – otrzymamy aktywność, która jest obecnie powiązana. np. View mv = getActivity().findViewById(R.id.activity1); Z poziomu aktywności: findFragmentById() – odnajduje powiązany fragment po id. findFragmentByTag() – odnajduje powiązany fragment po tagu. np. MyFragment mf = (MyFragment) getFragmentManager().findFragmentbyId(R.id.fragment1);
Dodawanie fragmentu do aktywności (dynamicznie) FragmentManager – interfejs do interakcji z fragmentami zagnieżdżonymi w aktywności. Metoda getFragmentManager() zwraca instancję menadżera. Dla wyższych API zaleca się getSupportFragmentManager(). beginTransaction() – umożliwia dokonywanie edycji fragmentów zarządzanych przez FragmentManager. Należy utworzyć/wykonać transakcję jedynie przed zapisem stanu fragmentu.
Zamiana fragmentu replace(int, Fragment) – zastąpienie istniejącego fragmentu dodanego do jakiegoś kontenera, nowym. addToBackStack(String) – dodanie transakcji do back stacku (przyjmuje tag fragmentu).
Usunięcie fragmentu remove() – usunięcie fragmentu. isInLayout() – sprawdza czy fragment jest już obecnie dodany do aktywności.
Aktywność z fragmentem (layout)
Przykład1 Aplikacja z jedną aktywnością i dwoma fragmentami, które są zapisywane w back stacku. Pliki układów takie jak wcześniej opisane. Tworzenie pierwszego fragmentu: Drugi fragment wygląda tak samo, jedyna róźnica to nazwa klasy MyFragment1 oraz tekst tv “Fragment2”.
Przykład1 kont. 1
Rezultat
ActionBar App Bar podnosi jakość doświadczeń użytkownika. Wyświetla aktualne miejsce w aplikacji, w którym użytkownik się znajduje. Udostępnia funkcje jak nawigacja oraz wyszukiwanie. Sprawia, że poruszanie się po aplikacji jest bardziej intuicyjne (podobne do wielu innych aplikacji).
Toolbar Jest uogólnieniem ActionBar. Został dodany w API 21 (Lolipop) wraz z Material Design Toolbar jest widokiem co umożliwia lepszą kontrolę oraz elastyczność. Toolbar może być zagnieżdżony w różnych poziomach hierarchii układu aktywności (w przeciwieństwie do ActionBar).
TabLayout Dostarcza układ horyzontalny do pokazywania zakładek. Aby móc korzystać z TabLayout należy dodać do dependencies w pliku build.gradle:app : compile ‘com.android.support:design:23.1.0’ lub nowsza wersja newTab() – tworzy i zwraca nową zakładkę TabLayout.Tab addTab(TabLayout.Tab, int, boolean) – dodanie zakładki do układu na wskazanej pozycji oraz ustawieniem czy ma być wybrana. Domyślna wersja metody dodaje zakładkę jako ostatnią oraz jeżeli jest pierwsza zostaje wybrana (domyślnie pokazująca się). setTabGravity() – wybranie sposobu w jaki, zakładki będą pozycjonowane. GRAVITY_CENTER - centrowanie GRAVITY_FILL – wypełnia TabLayout jak bardzo jest to możliwe
TabLayout kont. 1 TabLayout.OnTabSelectedListener – interfejs wywołań zwrotnych powołany po zmianie stanu zaznaczenia zakładki. onTabSelected() – wywołana kiedy zakładka przechodzi w stan zaznaczenia. onTabUnselected() - wywołana kiedy zakładka przechodzi w stan odznaczenia. onTabReselected() – wywołana kiedy użytkownik ponownie zaznacza zaznaczoną już zakładkę. TabLayout.Tab – reprezentuje zakładkę. getPosition() – zwraca aktualną pozycję zakładki.
ViewPager Służy do zarządzania i przesuwania stronami (np. fragment). setAdapter(PagerAdapter) – ustawia PagerAdapter (bazowa klasa) do dostarczania widoków. addOnPageChangeListener(ViewPager.onPagehangeListener) – nasłuchuje na zmianę strony. setCurrentItem(int, boolean) – ustala aktualnie wybraną stronę.
Tworzenie zakładek (tabs)
Zakładka 1 (layout)
Zakładka 2 (layout)
Zakładka 3 (layout)
PageAdapter PageAdapter - abstrakcyjna klasa, dlatego musimy stworzyć własną implementację. Alternatywnie: FragmentPagerAdapter - przetrzymuje wszystkie fragmenty w pamięci FragmentsStatePagerAdapter - przetrzymuje jedynie savedInstanceState stanów fragmentów (usuwa te bez focusa)
Aktywność z zakładkami (kod) android.support.v4: ViewPager Fragment FragmentManager FragmentSupportManager FragmentStatePagerAdapter android.support.v7: AppCompatActivity Toolbar
Aktywność z zakładkami (kod) kont. 1
Aktywność z zakładkami (kod) kont. 2
Aktywność z zakładkami (layout)
Rezultat