Aktywności i kontrolki

Ostatania modyfikacja: 12 sierpnia 2014, kategoria: Android

Aktywności to podstawowe elementy związane z platformą Android. Dzięki poznaniu aktywności będziesz w stanie napisać pierwszą aplikację przeznaczoną na urządzenie mobilne. Po dodaniu kontrolek możesz w łatwy sposób stworzyć całkiem funkcjonalny programik. Ważne jest, aby poznać metody operowania na kontrolkach oraz to jak przechowywać ich referencje.

Aktywności i widoki

Pisząc aplikację dedykowaną na platformę Android musisz mieć świadomość, że składa się ona z aktywności i widoków. Są to podstawowe elementy reprezentujące „okna” nowej aplikacji.

Aktywności to główne elementy z jakich zbudowane są aplikacje. Reprezentują one pojedyncze „okno” programu (choć nie jest to zasadą). Aktywności mają za zadanie realizowanie podstawowych operacji takich jak komunikacja z użytkownikiem, generowanie okna aplikacji itp.

Każda aktywność dziedziczy z klasy Activity lub klas jej pochodnych.

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Widoki to obiekty tworzące interfejs użytkownika. Za pomocą widoków użytkownik komunikuje się z aplikacją (z aktywnościami). Na widok składa się układ kontrolek zawartych w odpowiedniej kompozycji (layout).

Aby trochę rozjaśnić nadmiar teorii, można napisać wprost. Aktywności zawierają w sobie kod aplikacji, są zapisane w plikach z rozszerzeniem *.java. Z kolei widoki to wygląd okienka i układ kontrolek, które widzą użytkownicy programu, są zapisane w plikach z rozszerzeniem *.xml.

Podczas tworzenia nowego projektu Androida automatycznie zostaje wygenerowana nowa aktywność o nazwie MainActivity. Jest do niej także przypisany automatycznie wygenerowany widok o nazwie activity_main. Dzięki temu, po utworzeniu nowego projektu od razu możesz uruchomić nową aplikację (Ctrl + F11). Jeżeli nie wiesz jak utworzyć nowy projekt, przeczytaj artykuł Jak zacząć z platformą Android?

Tworzenie nowej aktywności

Na potrzeby kursu, stwórzmy nową aktywność i prosty widok. W tym celu kliknij prawym przyciskiem myszy na nazwę projektu w Package Explorer po lewej stronie. Wybierz pozycję New > Other.. > Android Activity > Blank Activity. W nazwie aktywności wpisz NowaActivity a w nazwie widoku activity_nowa. Nazwy mogą być dowolne, ale dla porządku warto trzymać się tej koncepcji nazywania widoków i aktywności. Nie chcemy korzystać z fragmentów, a więc wpisujemy nazwę fragmentu taką samą jak nazwę widoku. Ostatnim ważnym krokiem jest zaznaczenie opcji Luncher Activity. Dzięki temu nasza aktywność stanie się aktywnością startową.

nowa aktywność

Spójrzmy jak wygląda hierarchia plików w środowisku Eclipse. Na czerwono zaznaczyłem katalog zawierający aktywności, na niebiesko katalog z widokami a na zielono plik manifestu. Jak widać aktywność jest klasą publiczną i ma taką samą nazwę jak nazwa pliku aktywności. W metodzie OnCreate podpinamy się do widoku za pomocą metody setContentView(). Resztę kodu należy usunąć (opisałem do w poprzednim artykule), w przeciwnym wypadku wystąpią u Ciebie błędy kompilacji. Reszta kodu odpowiedzialna jest za fragmenty, których nie chcemy obsługiwać oraz za obsługę menu. NowaActivity powinna ostatecznie wyglądać mniej więcej tak:

podpinanie aktywności do widoku

To jeszcze nie koniec. Ostatnim krokiem jaki musimy wykonać jest edycja manifesu. W pliku manifest  zawarte są różne informacje dotyczące naszej aplikacji. Nie będę opisywał tego pliku, jednak konieczna jest jego drobna modyfikacja w celu zmiany aktywności startowej.

Kliknij dwukrotnie na pozycję AndroidManifest.xml. Będziemy edytować go w trybie tekstowym, w tym celu na poziomej belce kliknij na zakładkę AndroidManifest.xml

android manifest

W kodzie manifestu odnajdujemy definicję aktywności. Aby NowaActivity była startową musi posiadać filter LUNCHER. Z kolei aktywność MainActivity nie może posiadać tego filtra.

<activity android:name="com.example.test.MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <!--  usuwamy stąd filter LUNCHER -->
    </intent-filter>
</activity>
<activity android:name="com.example.test.NowaActivity" android:label="@string/title_activity_nowa">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Modyfikacja widoku

W poprzednim akapicie utworzyliśmy nową aktywność oraz ustawiliśmy ją jako startową. Podczas tworzenia aktywności automatycznie utworzony został widok o nazwie activity_nowa. Widok jest pusty, dodajmy do niego kilka kontrolek.

Kliknij dwukrotnie na pozycję activity_nowa.xml. Pokaże się prosty edytor podobny do HTMLowych WYSIWYGów. Jeżeli zamiast edytora kontrolek widzisz składnię XML, przełącz się na poziomej belce na pozycję Graphical Layout (tak jak w przypadku edycji manifestu).

Metodą drag & drop umieść na formie 3 kontrolki: TextView, EditText (PlainText) oraz Button. Znajdziesz je w zakładkach Form Widgets oraz Text Fields.

android kontrolki

To wszystko jeśli chodzi o edycję widoku, teraz wystarczy odpowiednio obsłużyć kontrolki umieszczone na formie.

Obsługa kontrolek

Obsługa kontrolek to ostatni element, który opiszę w tym artykule. Aby posiadać dostęp do kontrolek musimy zapisać ich referencje a później operować na nich.

Otwórz plik aktywności NowaActivity. Następnie zdefiniuj 3 publiczne referencje dla kontrolek, których użyliśmy w widoku. Są to kolejno: TextView, EditText oraz Button.

public class NowaActivity extends ActionBarActivity {

	public TextView text1;
	public EditText edit1;
	public Button button1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_nowa);

	}
}

Przy referencjach pojawi się błąd, jest to całkiem normalne. Do wszelkich referencji jakie definiujemy należy dodać importy. Możesz je wpisać ręcznie, automatycznie poprzez kliknięcia osobno w ikonkę błędu każdej referencji lub automatycznie dla całego projektu skrótem klawiaturowym.

Skrót klawiaturowy organizujący importy to Ctrl + Shift + O. Dodaje on importy do używanych klas oraz usuwa importy, które nie są używane w danej aktywności.

Po użyciu tego skrótu błędy powinny zniknąć. Posiadamy publiczne referencje oraz zaimportowaliśmy odpowiednie klasy. Ostatnim krokiem jest przypisanie referencji do kontrolek. Skorzystamy w tym celu z funkcji findViewById oraz z pliku R.java, który jest przez środowisko generowany automatycznie. Całość wygląda następująco:

 

public class NowaActivity extends ActionBarActivity {

	public TextView text1;
	public EditText edit1;
	public Button button1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_nowa);

		text1 = (TextView) findViewById(R.id.textView1);
		edit1 = (EditText) findViewById(R.id.editText1);
		button1 = (Button) findViewById(R.id.button1);

		text1.setText("Witaj!");
	}
}

Jeżeli błędy nie zniknęły

Jeżeli występują błędy przy referencjach, upewnij się, że zapisałeś widok po jego edycji. Jeżeli nie zapisałeś zmian w pliku widoku, obok jego nazwy na górnej poziomej belce będzie widoczna gwiazdka. Dodatkowo, plik R.java nie zostanie automatycznie wygenerowany co uniemożliwi przypisanie referencji do obiektów.

Dzięki zdefiniowaniu referencji do kontrolek posiadamy dostęp do ich obiektów. W przykładzie wyżej ustawiamy tekst kontrolki textView1 na „Witaj!”. Aplikacja po uruchomieniu wygląda następująco:

android program

Posiadam referencję do przycisku, więc mamy fizyczny dostęp do obiektu. Niestety na tym etapie nie możemy obsłużyć kliknięcia, ponieważ do tego wymagany będzie słuchacz (listener) a konkretniej OnClickListener. Słuchacze służą do przechwytywania zdarzeń z kontrolek i będą materiałem na kolejny artykuł.

Użytkownik Darek napisał:

26 września 2014


Artykuł jak zwykle super. Czekamy na dalszą część. W app na Android dopiero zaczynam.
Jak to jest, że niektórzy dokładają w layout zdarzenie „onClick” a niektórzy piszą o „OnClickListener”? Czym to się różni? Jakie są konwencje i co lepiej stosować? Jeśli nie tutaj, to bardzo proszę o wyjaśnienie tego w kolejnym artykule.

Użytkownik Karol napisał:

26 września 2014


Cześć. Są dwie metody na obsłużenie kliknięcia w androidzie.

1) Implementujemy „OnClickListener” dla całej naszej klasy. Wtedy jesteśmy zmuszenie zaimplementować zdarzenie „OnClick()” razem z „@Override”. W nim za pomocą switcha obsługujemy kliknięcia wszystkich kontrolek na raz (rozróżniając po „View.getid()” z której kontrolki przyszło kliknięcie).

2) W zdarzeniu „.setOnClickListener” dla danej kontrolki tworzymy klasę anonimową „View.OnClickListener()”. Wtedy wewnątrz tej klasy dodajemy metodę „OnClick()”. Obsługujemy tu kliknięcie w jednej konkretnej kontrolce.

Tak czy tak, w obu przypadkach korzystamy z Listenera i tak czy tak w obu przypadkach ze zdarzenia „OnClick()”. Bardziej profesjonalne jest podejście 1), szczególnie gdy mamy dużo kontrolek.

Podejście 2) znajduje się często w prostych przykładach, gdzie występują raptem 1-2 buttony. Warto dodać, że często jest spotykane takie użycie klas anonimowych w Androidzie.

Użytkownik Maciek napisał:

20 października 2014


Cześć,

czy artykuły będą wydawane cyklicznie ?:)

Użytkownik Karol napisał:

21 października 2014


Taki był początkowy zamiar, aczkolwiek czas nie pozwala.

Użytkownik Hehe napisał:

25 marca 2016


Taki byl zamiar… po co blog jak brak wpisow, nowosci itd. Po co bloga prowadzisz zeby w nim wpisy zaczynac od prostego przykladu dostepnego wszedzie?? Zastanow siebstary czy to zabawa czy nie

Użytkownik Karol napisał:

25 marca 2016


Zastanowię się

Użytkownik Karolina napisał:

05 kwietnia 2017


Bardzo dobry, wyczerpujący artykuł. Mam nadzieję, że w przyszłości pojawią się dalsze części. :)

Użytkownik Krzysiek napisał:

29 października 2018


Super teksty. Dziękuję i proszę o więcej. :)

Zachęcam Cię do zostawienia komentarza!

Ilość znaków: 0