[ Pobierz całość w formacie PDF ]
danych w postaci listy. Składniki listy są zarządzane poprzez wewnętrzną klasę ListView
(element interfejsu UI), wyświetlającą notatki w oknie listy. Po wstawieniu identyfikatora
URI do intencji danej aktywności aktywność ta zgłasza gotowość do zbudowania kontek-
stowego menu dla notatek. Jeżeli Czytelnik starał się poznać tę aplikację, zauważył zapewne,
że w zależności od wybranego elementu wyświetlane jest menu kontekstowe. Jeśli na przy-
kład zostanie zaznaczona notatka, zostaną wyświetlone opcje Edit note oraz Edit title. Jeżeli
notatka nie zostanie zaznaczona, dostępna będzie opcja Add note.
64 Android 2. Tworzenie aplikacji
Widzimy następnie, że aktywność wykonuje zarządzaną kwerendę, w wyniku czego pojawia
się kursor. Poprzez zarządzaną kwerendę mamy na myśli, że Android będzie zarządzał
przywołanym kursorem. Jako część tego procesu zarówno aplikacja, jak i aktywność nie
muszą martwić się pozycjonowaniem kursora, jego wczytywaniem lub usunięciem z pamięci
w przypadku wczytania lub usunięcia aplikacji z pamięci. Interesujące są parametry
elementu managedQuery(), opisane w tabeli 2.3.
Tabela 2.3. Parametry elementu Activity.managedQuery()
Parametr Typ danych Opis
Identyfikator URI dostawcy treści
URI Uri
Zwracana kolumna (nazwy kolumn)
projection String[]
Opcjonalna klauzula where
selection String
Wybierane argumenty w przypadku, gdy kwerenda
selectionArgs String[]
zawiera znaki zapytania
Kolejność sortowania zestawu wynikowego
sortOrder String
Elementy managedQuery() oraz blizniaczy query() omówimy w dalszej części tego podroz-
działu oraz w rozdziale 3. Na razie istotna jest informacja, że kwerendy w Androidzie zwra-
cają dane tabelaryczne. Parametr projection pozwala określić interesujące nas kolumny.
Można także ograniczyć wynikowy zestaw oraz go posortować za pomocą klauzuli sortowa-
nia, używanej w języku SQL (na przykład asc lub desc). Należy zauważyć także, że kwerenda
w Androidzie musi zwrócić kolumnę o nazwie _ID, żeby móc obsługiwać wyświetlanie po-
jedynczych rekordów. Ponadto należy znać typ danych zwracanych przez dostawcę treści
czy kolumna zawiera dane typu string, int, binary i tak dalej.
Po wykonaniu kwerendy zwrócony kursor jest przekazywany konstruktorowi elementu
SimpleCursorAdapter, przekształcającemu rekordy zestawu danych w elementy interfejsu
użytkownika (ListView). Przyjrzyjmy się bliżej parametrom przekazywanym do konstruk-
tora elementu SimpleCursorAdapter:
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, R.layout.noteslist_item,
cursor, new String[] { Notes.TITLE }, new int[] { android.R.id.text1 });
W szczególności zwróćmy uwagę na drugi parametr: identyfikator widoku reprezentującego
elementy w metodzie ListView. Jak się będzie można przekonać w rozdziale 3., Android
zawiera automatycznie generowaną klasę użytkową, zawierającą odniesienia do zasobów
projektu. Jest to tak zwana klasa R, gdyż mieści się w pliku R.java. Podczas kompilowania
projektu narzędzie AAPT tworzy klasę R z zasobów umieszczonych w folderze res. Na przy-
kład można umieścić wszystkie zasoby składające się z ciągów znaków w folderze values,
a narzędzie AAPT wygeneruje identyfikator public static dla każdego z tych zasobów.
Generalnie Android obsługuje w ten sposób wszystkie zasoby. Na przykład w konstruktorze
elementu SimpleCursorAdapter aktywność NotesList przekazuje identyfikator widoku
umożliwiającego wyświetlanie elementu listy notatek. Dzięki tej klasie użytkowej nie ma
potrzeby umieszczania zasobów wewnątrz głównego kodu oraz uzyskuje się możliwość
sprawdzania odniesień w trakcie kompilacji. Inaczej mówiąc, jeżeli zasób zostanie usunięty,
klasa R straci do niego odniesienie i żaden kod powiązany z tym zasobem nie zostanie
skompilowany.
Rozdział 2 Pierwsze koty za płoty 65
Przyjrzyjmy się kolejnej koncepcji Androida, o której wspomnieliśmy nieco wcześniej: me-
todzie onListItemClick() w klasie NotesList (listing 2.3).
Listing 2.3. Metoda onListItemClick
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
String action = getIntent().getAction();
if (Intent.ACTION_PICK.equals(action) ||
Intent.ACTION_GET_CONTENT.equals(action)) {
setResult(RESULT_OK, new Intent().setData(uri));
} else {
startActivity(new Intent(Intent.ACTION_EDIT, uri));
}
}
Metoda onListItemClick() jest wywoływana po zaznaczeniu notatki przez użytkownika.
Jest ona przykładem aktywności uruchamiającej inną aktywność. Po zaznaczeniu notatki
metoda ta tworzy identyfikator URI poprzez dodanie identyfikatora danej notatki do bazo-
wego identyfikatora URI. Zostaje on następnie przekazany metodzie startActivity()
wraz z nową intencją. Użycie metody startActivity() jest jednym ze sposobów urucho-
mienia aktywności: aktywność zostaje rozpoczęta, jednak po jej zakończeniu nie zostaje wy-
świetlony raport z wynikami. Inną możliwością uruchomienia aktywności jest użycie meto-
dy startActivityForResult(). Za jej pomocą można rozpocząć aktywność i zarejestrować
wywoływanie zwrotne po jej zakończeniu. Można zastosować metodę startActivity
ForResult() na przykład w przypadku uruchomienia aktywności służącej do zaznaczania
kontaktu, gdy ten kontakt ma być dostępny po zakończeniu aktywności.
W tym momencie można zacząć zastanawiać się, jak wygląda interakcja użytkownika
względem aktywności. Na przykład: jeżeli uruchomiona aktywność uruchamia następną
aktywność, a ta z kolei uruchamia inną aktywność (i tak dalej), to z którą aktywnością pra-
cuje użytkownik? Czy może kontrolować jednocześnie wszystkie aktywności, czy może jest
ograniczony do jednej? Okazuje się, że aktywności posiadają zdefiniowany cykl życia. Są
one utrzymywane w stosie aktywności, na którego szczycie znajduje się uruchomiona ak-
tywność. Jeżeli aktywność uruchomi inną aktywność, pierwsza uruchomiona aktywność
przesunie się w dół stosu, a nowa zostanie umieszczona na jego szczycie. Aktywności znaj-
dujące się na niższych poziomach stosu mogą znajdować się w stanie wstrzymania lub za-
trzymania. Wstrzymana aktywność jest częściowo lub całkowicie widoczna dla użytkownika;
aktywność zatrzymana jest dla niego niewidoczna. System może usunąć ze stosu wstrzymane
[ Pobierz całość w formacie PDF ]