Monthly Archives: December 2012

LogicGateApp cz.3

Omówienie treści

W tym poście zajmiemy się stworzeniem nowych aktywności, które będą mogły być włączane przez menu główne nasze aplikacji. Tworzenie aktywności składać się będzie z:

  • utworzenia klasy dziedziczącej po Activity
  • utworzenia layoutu strony
  • dodania wpisu w AndroidManifest.xml

Na końcu postu podepniemy odpalanie aktywności do aktywności stworzonej w poprzednim poście.

Tworzymy layout naszych aktywności

chose_gate_layout.xml

Tworzymy nowy plik: chose_gate_layout.xml
Katalog pliku to: res->layout
Do katalogu drawable-hdpi wklejam zdjęcie które wykorzystam w stronie o autorze 🙂
layout
Edytujemy zawartość pliku strings.xml dodając napisy niezbędne dla przycisków.
strings2

Edytujemy zawartość pliku tak by osiągnąć zamierzony wygląd naszej aktywności.

layoutxml

Kod xml odpowiada za taki wygląd layoutu.

layout_graphic

about_author_layout.xml

Tworzymy nowy plik: about_author_layout.xml
Katalog pliku to: res->layout

aboutAuthorxml

Dodajemy napisy do strings.xml

strings3

Dodajemy style do app_styles.xml odpowiedzialne za formatowanie tekstu w layoucie.

styles2xml

Dodatkowo tworzymy plik color.xml w katalogu res->values. Plik zawiera  definicje kolorów które możemy używać w aplikacji.

color1

Wygląd:

aboutAuthorGraphic

Tworzymy klasy

ChoseGateActivity

Dodajemy do pakietu naszej aplikacji klasę ChoseGateActivity :

package com.adam_mistal.logicgateapp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

public class ChoseGateActivity extends Activity {
	 @Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.chose_gate_layout);
	        initButtons();
	    }

	private void initButtons() {
		final Button andButton = (Button) findViewById(R.id.and_button);
		andButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("ChoseGateActivity", "and");
				}
				return false;
			}
		});
		final Button orButton = (Button) findViewById(R.id.or_button);
		orButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("ChoseGateActivity", "or");
				}
				return false;
			}
		});
		final Button notButton = (Button) findViewById(R.id.not_button);
		notButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("ChoseGateActivity", "not");
				}
				return false;
			}
		});
		final Button nandButton = (Button) findViewById(R.id.nand_button);
		nandButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("ChoseGateActivity", "nand");
				}
				return false;
			}
		});
		final Button xorButton = (Button) findViewById(R.id.xor_button);
		xorButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("ChoseGateActivity", "xor");
				}
				return false;
			}
		});
		final Button returnButton = (Button) findViewById(R.id.return_button);
		returnButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("ChoseGateActivity", "return");
                                        finish();
				}
				return false;
			}
		});

	}

}

Analogicznie jak w głównej aktywności w metodzie initControls() łącze kod xml z kodem java. W 81 linijce użyłem metody finish() która zgodnie z intencjią czyli po naciśnięciu przycisku “Wróć” zamknie aktywność po czym przywołana zostanie aktywność poprzednia czyli MainActivity

AboutAuthorActivity

Dodajemy do pakietu naszej aplikacji klasę AboutAuthorActivity :

package com.adam_mistal.logicgateapp;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;

public class AboutAuthorActivity extends Activity {
	 @Override
	    protected void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.about_author);
	        initButtons();
	    }

	private void initButtons() {
		final Button backButton = (Button) findViewById(R.id.return_button);
		backButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("AboutAuthorActivity", "return");
					finish();
				}
				return false;
			}
		});
		
	}

}

Dodajemy wpisy w AndroidManifest.xml

LogicGateActivity

manifest1

AboutAuthorActivity

manifest2

Podpinamy włączenie aktywności do MainActivity

W klasie MainActivity edytujemy:

final Button startButton = (Button) findViewById(R.id.start_button);
		startButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("MainActivity", "startButton");
					Intent intent=new Intent(getBaseContext(),ChoseGateActivity.class);
					startActivity(intent);
				}
				return false;
			}
		});

final Button authorButton = (Button) findViewById(R.id.author_button);
		authorButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("MainActivity", "authorButton");
					Intent intent=new Intent(getBaseContext(),AboutAuthorActivity.class);
					startActivity(intent);
				}
				return false;
			}
		});
final Button closeButton = (Button) findViewById(R.id.close_button);
		closeButton.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					Log.i("MainActivity", "closeButton");
					finish();
				}
				return false;
			}
		});

Odpalenie nowej aktywności osiągamy poprzez wywołanie metody startActivity pobierającej jako parametr obiekt typu Intent.

Konstruktor klasy Intent pobiera jako parametry obiekt typu Context oraz klasę która ma być wykonana.

Test

Przykładowy wygląd okna LogCat

logcattest

LogicGateApp cz.1 -pierwszy projekt

Pomysł na pierwszą aplikacje – określenie funkcjonalności

W poprzednim poście uruchomiliśmy emulator android. Jesteśmy w stanie testować aplikacje. Przystępujemy do pracy 🙂 Napiszemy aplikacje która nietypowo nie będzie wyświetlać napisu hello world. Niech nasza aplikacja będzie użyteczną.
Nazwa aplikacji: LogicGateApp
Zadania aplikacji:

  • emulowanie działania bramek logicznych
  • wyświetlanie tablicy prawdy poszczególnych bramek logicznych

Pokrótce wyjaśnię że bramki logiczne to podstawowe elementy elektroniczne służące do konstrukcji układów cyfrowych. Każda bramka implementuje podstawową funkcję logiczną. Bramki logiczne  które będą implementowane w programie to:

  • AND iloczyn logiczny
  • OR suma logiczna
  • NOT negacja
  • NAND negacja iloczynu
  • XOR bramka równoważności

Skoro mam już określone wymagania zaprojektuje wygląd poszczególnych okien  aplikacji.

activities_plan

Wiemy już jak aplikacja będzie wyglądać od strony użytkownika, wiemy też jakie funkcje ma spełniać. Przystąpmy do kodowania.

Projekt w eclipse – pierwsze Activity

Tworzymy nowy projekt w eclipse: File->New->Android Aplication Project następnie w opcjach dodawania nowego projektu wypełniamy odpowiednie pola jak na rysunku poniżej.

new_android_project

Po przejściu dalej możemy wybrać ikonę dla naszego projektu. Można wybrać z pliku lub też z przygotowanych w eclipse clipartów. Do celów tego programu wybiorę clipart.

luncher_and

Koleje okna wyboru dotyczą rodzaju tworzonego Activity czyli odpowiednika okna w systemie Windows.

create_activity1

createActivity2

Klikamy Finish .Udało się nam stworzyć pierwszy projekt w eclipse. Już na tym etapie jesteśmy w stanie uruchomić naszą aplikację. Jedyną rzeczą którą nam się ukaże będzie napis Hello World. Włączmy nasz emulator który utworzyliśmy w poprzednim poście. Następnie musiby zbudować nasz projekt możemy to zrobić klikając Project->Build All (CTR+B). Klikamy PPM na węzeł naszego pakietu i wybieramy polecenie Run As-> Android Aplication

LogicGateApp1

Po kilku chwilach aplikacja instaluje się na emulatorze który włączyliśmy uprzednio. Mamy pewność że wszystko poszło tak jak trzeba.

firstActivity

W następnym wpisie opisze strukturę projektu w środowisku eclipse.

Uruchamiamy AVD- Android na PC :)

Utworzyliśmy ostatnio emulator androida. Jest obecnie wyłączony i czeka tylko na nas byśmy mogli go odpalić 🙂 A więc do dzieła, wybieramy nasz emulator i klikamy : Android Virtual Device Manager->Start…

avd3

W oknie Lunch Options ustawiamy odpowiednio wartości:

  • Screen Szie(in)-rozmiar do jakiego ma się skalować okno emulatora. W moim przypadku jest to 5 cali.
  • Wipe user data– zaznaczenie tego pola oznaczać będzie że jeśli mamy na urządzeniu wirtualnym nasze dane to zostaną one utracone(np. aplikacje, pliki bazy danych)

Następnie uruchamiamy emulator przyciskiem Launch . Stało się 🙂 emulator wystartował
emulator1

emulator2

Tworzenie AVD-Android Virtual Device

Mając skonfigurowane środowisko pracy ostatnią rzeczą potrzebną nam do pracy jest możliwość testowania aplikacji. Do tego celu możemy wykorzystać fizyczne urządzenie z systemem android jak również AVD czyli android virtual device. W tym poście zajmiemy się drugim sposobem czyli utworzymy wirtualne urządzenie android na naszym komputerze. Wybieramy w eclipse Window->AVD Manager. W oknie managera wybieramy New

avd1

Wypełniamy pola w zależności od wersji systemu Android który ma emulować nasze urządzenie. W moim przypadku jest to wersja 2.3.3. Nazwa jest dowolna jej określenie ma za zadanie pomóc na przy rozróżnieniu emulatorów wybieranych przez nas do testów .Dodatkowo zaznaczyłem emulacje karty SD oraz określiłem jaka przestrzeń dyskowa zostanie jej przekazana. Jak widać można również dokonać zmian innych parametrów tworzonego emulatora. Klikamy Create AVD. Emulator został dodany do listy managera jak pokazałem na screenie poniżej.

avd2

Możemy utworzyć kilka emulatorów w celu testowania naszych aplikacji na różnych wersjach systemów czy też różnych rozdzielczościach. Udało się nam stworzyć emulator urządzenia android który możemy uruchomić na naszym komputerze.

Instalacja narzędzi

Programowanie aplikacji na platformę Android, które będzie głównym tematem bloga  Rozpoczniemy od pobrania wymaganych narzędzi. Nasz warsztat będzie wymagał pobrania oraz skonfigurowania:

  1. Java JDK dla naszych celów wersja 6.0
  2. Eclipse
  3. Android SDK być może paczka SDK zawierać już Eclipse

Instalacja środowiska Java nie powinna nastręczać trudności. Po pobraniu oprogramowania przystępujemy do konfiguracji. Android SDK wypakujmy np. do katalogu C:\Program Files\android-sdk
Musimy skonfigurować Eclipse go do pracy z platformą Android. W tym celu musimy pobrać plug-in ADT- Android Development Toolkit. W Eclipse: Help->Install New Software…
adt

Następnie przycisk Add. W nowym oknie wypełniamy pola jak poniżej:

adt2

Zaznaczamy pokazane komponenty.

adt3

Kolejną czynnością jest wskazanie Eclipse ścieżki do Android SDK: Window->Preferences

sdk1

Po określeniu ścieżki do katalogu w którym znajduje się pobrane SDK Androida przystąpimy do pobrania odpowiednich pakietów zawierających potrzebne nam wersje SDK androida bądź tez aktualizacje bieżących: Window->Android SDK Manager

sdk2

Wybieramy interesujące nas wersje SDK oraz dodatków następnie instalujemy .

W tym momencie mamy już skonfigurowane niezbędne narzędzia. Możemy rozpocząć przygodę z Androidem.