Fragmenty
367
jesteś tutaj
Określenie zawartości widoków w metodzie onStart() fragmentu
Musimy zadbać o to, by nasz fragment
WorkoutDetailFragment
wyświetlał szczegółowe
informacje o wybranym treningu. Operacja ta musi być wykonywana, kiedy aktywność
staje się widoczna, dlatego zaimplementujemy ją w metodzie
onStart()
fragmentu.
Oto zmodyfikowany kod fragmentu
WorkoutDetailFragment
:
app/src/main
WorkoutDetail
Fragment.java
Trenazer
java
com.hfad.trenazer
package com.hfad.trenazer;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class WorkoutDetailFragment extends Fragment {
private long workoutId;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_workout_detail, container, false);
}
@Override
public void onStart() {
super.onStart();
View view = getView();
if (view != null) {
TextView title = (TextView) view.findViewById(R.id.textTitle);
Workout workout = Workout.workouts[(int) workoutId];
title.setText(workout.getName());
TextView description = (TextView) view.findViewById(R.id.textDescription);
description.setText(workout.getDescription());
}
}
public void setWorkout(long id) {
this.workoutId = id;
}
}
Używamy tej klasy
w metodzie onStart().
Metoda getView() pobiera główny widok fragmentu.
Możemy go później użyć do pobrania referencji do
widoków wyświetlających tytuł i opis treningu.
Jak napisaliśmy na poprzedniej stronie, fragmenty różnią się od aktywności i dlatego
nie dysponują wszystkimi metodami, które mają aktywności. Na przykład fragmenty
nie udostępniają metody
findViewById()
. Dlatego aby pobrać referencje do
widoków fragmentu, musimy najpierw pobrać referencję do widoku głównego,
używając w tym celu metody
getView()
, a następnie pobrać jego widoki podrzędne.
Skoro zadbaliśmy już o aktualizację widoków fragmentu, możemy wziąć naszą
aplikację na małą jazdę próbną.
Implementując
metody cyklu życia
fragmentu, zawsze
musisz wywoływać
analogiczną metodę
klasy bazowej.
368
Rozdział 9.
Co się dzieje?
Zostaje utworzona aktywność MainActivity.
Użytkownik klika przycisk wyświetlony w aktywności
MainActivity
,
by uruchomić aktywność
DetailFragment
.
MainActivity
Urządzenie
DetailActivity
Zostaje wykonana metoda onCreate() aktywności DetailActivity.
Metoda
onCreate()
określa, że aktywność
DetailActivity
korzysta z układu zdefiniowanego
w pliku
activity_detail.xml. Plik activity_detail.xml zawiera element
<fragment>
, któremu przypisano
identyfikator
detail_frag
; element ten odwołuje się do fragmentu
WorkoutDetailFragment
.
DetailActivity
<Layout>
</Layout>
activity_detail.xml
onCreate()
WorkoutDetail
Fragment
Zostaje wykonana metoda onCreateView() fragmentu WorkoutDetailFragment.
Metoda
onCreateView()
określa, że fragment
WorkoutDetailFragment
korzysta z układu
zdefiniowanego w pliku
fragment_workout_detail.xml. Metoda przetwarza ten układ,
przekształcając go na obiekt
View
.
<Layout>
</Layout>
fragment_
workout_detail.xml
onCreateView()
Widok
¨
Fragment WorkoutDetailFragment
¨
Fragment WorkoutListFragment
¨
Koordynacja fragmentów
Co się dzieje po uruchomieniu aplikacji?
Zanim wypróbujemy naszą aplikację, przeanalizujmy dokładniej,
co się dzieje po jej uruchomieniu:
1
2
3
Fragmenty
369
jesteś tutaj
Podczas przetwarzania układu activity_detail.xml zdeniowane w nim widoki zostają
przekształcone w obiekty Javy.
Aktywność
DetailActivity
używa obiektu
View
fragmentu
WorkoutDetailFragment
do
zastąpienia elementu
<fragment>
umieszczonego w kodzie XML układu; jednocześnie przypisuje
temu obiektowi identyfikator
detail_frag
.
<Layout>
</Layout>
activity_detail.xml
Widok
id: detail_frag
W dalszym ciągu wykonywana jest metoda onCreate() aktywności DetailActivity.
Aktywność
DetailActvity
pobiera referencję do fragmentu
WorkoutDetailFragment
,
prosząc menedżera fragmentów o zwrócenie fragmentu o identyfikatorze
detail_frag
.
Fragment używa przekazanego numeru treningu w swojej metodzie onStart(),
w której określa zawartość widoków.
MainActivity
WorkoutDetail
Fragment
WorkoutDetail
Fragment
id: detail_frag
textTitle: Ogólna agonia
textDescription: 100 podciągnięć,
100 pompek,
100 brzuszków,
100 przysiadów.
onCreate()
onStart()
Widok
Aktywność DetailActivity wywołuje metodę setWorkout() fragmentu WorkoutDetailFragment.
Aktywność
DetailActivity
przekazuje do fragmentu
WorkoutDetailFragment
identyfikator treningu
o wartości
1
. Fragment zapisuje tę wartość w składowej
workoutId
.
MainActivity
WorkoutDetail
Fragment
setWorkout(1)
onCreate()
Menedżer fragmentów
workoutId: 1
workoutId: 1
4
5
6
7
Opowieści ciąg dalszy
A teraz weźmy naszą aplikację na jazdę próbną.
370
Rozdział 9.
Jazda próbna
P
: Dlaczego aktywność nie może pobrać fragmentu,
używając metody
findViewById()
?
O
:
Dlatego, że metoda findViewById() zawsze zwraca obiekt
typu View, a choć to zadziwiające, okazuje się, że fragmenty
nie są widokami.
P
: Skoro aktywności mają metodę
findViewById()
,
to czemu nie mają metody
findFragmentById()
?
O
:
To dobre pytanie. Fragmenty nie były dostępne przed
wprowadzeniem API poziomu 11., dlatego wprowadzono do
systemu menedżery fragmentów, stanowiące sposób dodania
do niego przydatnego kodu do zarządzania fragmentami,
a jednocześnie pozwalające uniknąć konieczności dodawania
obszernego kodu do klasy bazowej aktywności.
P
: Dlaczego fragmenty nie dysponują metodą
findViewById()
?
O
:
Ponieważ fragmenty nie są ani widokami, ani aktywnościami.
Zamiast niej musimy użyć metody getView() fragmentu, by
pobrać jego widok główny, a następnie skorzystać z jego metody
findViewById(), by odszukać jego widoki podrzędne.
P
: Aktywności trzeba rejestrować w pliku manifestu
AndroidManifest.xml, gdyż w przeciwnym razie aktywność
nie będzie w stanie ich używać. Czy podobnie trzeba
rejestrować fragmenty?
O
:
Nie. Aktywności muszą być rejestrowane w pliku
AndroidManifest.xml
, a fragmenty nie.
głupie pytania
Nie istnieją
Jazda próbna aplikacji
Kiedy uruchomimy aplikację, zostanie wyświetlona aktywność
MainActivity
.
Kiedy klikniemy przycisk wyświetlony w aktywności
MainActivity
, zostanie
uruchomiana aktywność
DetailActivity
. Aktywność
DetailActivity
zawiera
fragment
WorkoutDetailFragment
, który wyświetla trening o nazwie Ogólna agonia.
…a zostaną wyświetlone
szczegóły treningu.
Kliknij ten
przycisk…
¨
Fragment WorkoutDetailFragment
¨
Fragment WorkoutListFragment
¨
Koordynacja fragmentów
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.