464
Rozdział 11.
Układ FrameLayout
¨
Konwersja stopera
¨
Testy stopera
¨
Dodanie do fragmentu
<?xml version=”1.0” encoding=”utf-8”?>
<fragment FrameLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:name=”com.hfad.trenazer.StopwatchFragment”
android:id=”@+id/stopwatch_container”
android:layout_width=”match_parent”
android:layout_height=”match_parent”/>
W układzie activity_temp.xml zastosuj
układ FrameLayout
Zgodnie z tym, czego się dowiedziałeś w rozdziale 10., kiedy chcemy dodawać
fragmenty do aktywności przy użyciu transakcji fragmentu, w pierwszej
kolejności do układu aktywności musimy dodać element, w którym później
umieścimy fragment. W rozdziale 10. zrobiliśmy to, dodając do układu
element
FrameLayout
i przypisując mu identyfikator, dzięki któremu
mogliśmy się potem odwoływać do tego elementu w kodzie aktywności.
Te same zmiany musimy wprowadzić teraz w kodzie pliku
activity_temp.xml.
Zastąpimy w nim element
<fragment>
układem ramki —
FrameLayout
—
któremu nadamy identyfikator
stopwatch_container
. Zmodyfikuj swoją
wersję pliku
activity_temp.xml, by była identyczna z poniższym kodem:
<xml>
</xml>
app/src/main
activity_
temp.xml
Trenazer
res
layout
Dodaj obsługę transakcji fragmentu do pliku
TempActivity.java
Po dodaniu układu
FrameLayout
do układu aktywności możemy się zająć
utworzeniem transakcji fragmentu, która doda odpowiedni fragment do układu
aktywności.
Chcemy dodać fragment
StopwatchFragment
do aktywności
TempActivity
,
gdy tylko zostanie ona utworzona. Jednocześnie chcemy dodawać ten fragment
wyłącznie w przypadku, gdy nie został on dodany do aktywności już wcześniej.
Nie chcemy bowiem nadpisywać żadnych istniejących fragmentów.
Aby to zrobić, dodamy do metody
onCreate()
aktywności
TempActivity
kod,
który sprawdzi, czy parametr
savedInstanceState
ma wartość
null
.
Jeśli bowiem wartością parametru
savedInstanceState
będzie
null
, będzie
to oznaczać, że aktywność została utworzona po raz pierwszy. Tylko w tym
przypadku chcemy dodawać do niej fragment
StopwatchFragment
.
Jeśli jednak wartość parametru
savedInstanceState
będzie różna od
null
,
będzie to oznaczać, że aktywność
TempActivity
została usunięta
i odtworzona. W takiej sytuacji nie chcemy dodawać nowej instancji fragmentu
StopwatchFragment
, gdyż spowodowałoby to nadpisanie już istniejącego fragmentu.
Zastąp
fragment
słowem
FrameLayout.
Usuń ten wiersz.
Fragmenty dynamiczne
465
jesteś tutaj
Twoje zadanie polega na tym, by wyłowić fragmenty
kodu z basenu i umieścić je w odpowiednich pustych
miejscach kodu pliku
TempActivity.java
. Nie możesz użyć
jednego fragmentu kodu więcej niż raz, a jednocześnie nie
będziesz potrzebował wszystkich fragmentów z basenu.
Twoim celem jest utworzenie transakcji fragmentu,
która doda do aktywności TempActivity fragment
StopwatchFragment.
Zagadkowy basen
Uwaga: Każdy fragment
z basenu może zostać
użyty tylko raz!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp);
if (savedInstanceState == null) {
StopwatchFragment stopwatch = new StopwatchFragment();
FragmentTransaction ft = ................... . ..............;
ft.add(R.id.stopwatch_container, ............. );
ft. ............. (null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft. .............;
}
}
getSupportFragmentManager()
beginTransaction()
stopwatch
addToBackStack
commit()
endTransaction()
getFragmentManager()
app/src/main
TempActivity.java
Trenazer
java
com.hfad.trenazer
466
Rozdział 11.
Rozwiązanie
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_temp);
if (savedInstanceState == null) {
StopwatchFragment stopwatch = new StopwatchFragment();
FragmentTransaction ft = ............................... . ......................;
ft.add(R.id.stopwatch_container, ............. );
ft. ................... (null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft. .............;
}
}
getSupportFragmentManager() beginTransaction()
addToBackStack
commit()
endTransaction()
getFragmentManager()
Tych fragmentów
nie musiałeś
używać.
To wywołanie rozpoczyna transakcję
fragmentu. Musimy wywołać metodę
getSupportFragmentManager(), a nie
metodę getFragmentManager(), gdyż
używamy fragmentów z biblioteki wsparcia.
Dodajmy instancję StopwatchFragment
do układu aktywności TempActivity.
Zatwierdzamy transakcję.
Twoje zadanie polega na tym, by wyłowić fragmenty
kodu z basenu i umieścić je w odpowiednich pustych
miejscach kodu pliku
TempActivity.java
. Nie możesz użyć
jednego fragmentu kodu więcej niż raz, a jednocześnie nie
będziesz potrzebował wszystkich fragmentów z basenu.
Twoim celem jest utworzenie transakcji fragmentu,
która doda do aktywności TempActivity fragment
StopwatchFragment.
Zagadkowy basen. Rozwiązanie
app/src/main
TempActivity.java
Trenazer
java
com.hfad.trenazer
stopwatch
Dodajemy transakcję
do stosu cofnięć.
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.