W tej lekcji:
Do przeczytania:
Do wypróbowania:
Pobierz przykładowy interfejs.
Fragment można rozumieć jako moduł aktywności, który ma swój własny cykl życia, otrzymuje własne zdarzenia i który można dodawać bądź usuwać w czasie działania aktywności. To coś w rodzaju aktywności podrzędnej, którą można wykorzystywać w różnych aktywnościach. W tej lekcji dowiesz się, jak rozszerzyć klasę Fragment
korzystając z biblioteki pomocniczej, dzięki czemu twoja aplikacja będzie zgodna z urządzeniami na których zainstalowane są starsze wersje systemu, poczynając od Androida 1.6.
Fragment
i powiązanych z nią API. Pamiętaj tylko, że w poniższej lekcji skupiono się na wykorzystaniu API dostępnych w bibliotece pomocniczej, które mają konkretne sygnatury pakietów, a czasem też inne nazwy niż wersje dostępne w platformie.Przed rozpoczęciem lekcji musisz tak skonfigurować projekt, by korzystał z biblioteki pomocniczej. Jeśli do tej pory z niej nie korzystałeś, to dodaj bibliotekę v4 postępując zgodnie z instrukcjami w dokumencie Konfiguracja biblioteki pomocniczej (ang.). Możesz także skorzystać z biblioteki v7 appcompat, która umożliwi dodanie do aktywności paska akcji. Biblioteka ta jest zgodna z Androidem 2.1 (wersja 7 API), a także zawiera API klasy Fragment
.
Tworzenie klasy fragmentu
By utworzyć fragment, należy rozszerzyć klasę Fragment
, a następnie przedefiniować kluczowe metody cyklu życia i umieścić w nich kod sterujący zachowaniem aplikacji, tak jak w przypadku klasy Activity
.
Różnica polega na tym, że podczas tworzenia fragmentu musisz uwzględnić metodę zwrotną onCreateView()
, umożliwiającą zdefiniowanie układu aplikacji. Tak naprawdę jest to jedyna metoda zwrotna potrzebna do uruchomienia fragmentu. Oto prosty przykładowy fragment, który definiuje swój układ:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// dodaje układ fragmentu za pomocą metody inflate()
return inflater.inflate(R.layout.article_view, container, false);
}
}
Tak jak każda aktywność, fragment powinien mieć zaimplementowane również inne metody zwrotne cyklu życia, które umożliwią zarządzanie jego stanem, gdy zostanie dodany lub usunięty z aktywności, a także gdy aktywność będzie przechodzić pomiędzy swoimi stanami cyklu życia. Przykład: wywołanie na aktywności metody onPause()
spowoduje jednoczesne wywołanie tej metody na wszystkich znajdujących się w aktywności fragmentach.
Więcej informacji na temat cyklu życia fragmentu i jego metod zwrotnych znajdziesz w przewodniku programisty poświęconemu fragmentom.
Dodawanie fragmentu do aktywności za pomocą XML
Fragmenty stanowią modułowe komponenty interfejsu nadające się do wielokrotnego użytku, jednak każda instancja klasy Fragment
musi być skojarzona z nadrzędną klasą FragmentActivity
. Można to zrobić poprzez zdefiniowanie każdego fragmentu w pliku XML zawierającym szablon aktywności.
FragmentActivity
to specjalna aktywność dostępna w bibliotece pomocniczej, służąca do obsługiwania fragmentów w systemach korzystających ze starszych API niż wersja 11. Jeśli API w najniższej obsługiwanej przez aplikację wersji systemu ma numer 11 lub wyższy to można wówczas korzystać ze zwykłych aktywności.Oto przykładowy plik z układem, w którym do aktywności dodawane są dwa fragmenty, jeśli aplikacja została uruchomiona na „dużym” ekranie (rozmiar ten określa kwalifikator large
w nazwie katalogu).
res/layout-large/news_articles.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment android:name="com.example.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.example.android.fragments.ArticleFragment"
android:id="@+id/article_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
Następnie dodaj układ do aktywności:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
}
}
Jeśli korzystasz z biblioteki v7 appcompat, aktywność powinna rozszerzać klasę ActionBarActivity
, która jest podklasą klasy FragmentActivity
(więcej na ten temat możesz przeczytać w lekcji Dodawanie paska akcji).