Donnerstag, 14. November 2013

Auf einem richtigen Gerät testen


Ich habe bereits gezeigt wie man sich einen Emulator zum testen der eigenen Anwendungen einrichtet. Da es aber nicht schaden kann (oder sogar unerlässlich ist) den eigenen Code auch mal auf einem richtigen Gerät zu testen will ich kurz darauf eingehen wie man sein Smartphone oder Tablet so konfiguriert das man bequem aus Eclipse heraus damit arbeiten kann.

Das Gerät konfigurieren
Zunächst einmal müssen wir unser Android Gerät zur Hand nehmen und ein paar Einstellungen tätigen da es von Haus aus nicht möglich ist Anwendungen über USB zu installieren oder das Debugging zu nutzen. Der Grund dafür ist recht simpel: Die Sicherheit.
Als erstes Rufen wir die Systemeinstellungen auf und wählen den Punkt "Sicherheit".


In diesem Menü setzen wir dann ein Häckchen bei dem Punkt "Unbekannte Herkunft". Damit erlauben wir die Installation von Apps die nicht aus Google Play kommen. Falls hier jemand Sicherheitsbedenken haben sollte kann diese Funktion jederzeit wieder deaktiviert werden.

  

Jetzt gehen wir wieder zurück ins Hauptmenü der Systemeinstellungen und wählen den Punkt "Entwickleroptionen" aus.


In diesem Menü setzen wir dann die Häckchen bei "USB-Debugging" und "USB-Debugging-Info". Diese Optionen brauchen wir damit wir unsere Anwendung später auch vernünftig auf Fehler untersuchen können. Wobei letzteres nur dazu dient uns auf dem Gerät anzuzeigen falls das Debugging verbunden ist.


Das wars auch schon mit dem Gerät. Verbinden wir es jetzt mit dem Computer sollte uns eine Benachrichtigung angezeigt werden das USB-Debugging verbunden wurde. An dieser Stelle nocheinmal ein Hinweis zu den Menüs: Es ist durchaus möglich das die einzelnen Punkte unter verschiedenen Android Versionen unterschiedlich heißen oder an anderer Stelle zu finden sind!


Computer konfigurieren
In vielen Fällen ist es nicht notwendig noch irgendetwas besonderes am Computer einzustellen aber je nach Gerät kann es durchaus nötig sein einen entsprechenden USB-Treiber zu installieren. Damit mein HTC funktioniert musste ich mir zunächst HTC Sync installieren damit alles reibungslosläuft. Bei anderen Marken und Herstellen kann es ähnlich sein muss es aber nicht. Bietet der Herstellen einen Treiber an sollte man ihn installieren, wenn nicht und es trotzdem nicht funktioniert kann es helfen im SDK-Manager den Google USB-Treiber zu installieren.


Eclipse
Nachdem jetzt alles vorbereitet und unser Gerät angeschlossen ist brauchen wir jetzt nur noch Eclipse starten und können unseren Code schreiben. Starten wir unsere Anwendung jetzt sollte uns Eclipse ein Fenster zeigen in dem wir alle verfügbaren Emulatoren und alle angeschlossenen Geräte sehen. Hier wählen wir dann unser Gerät aus und klicken auf "OK". Wollen wir das unsere Anwendung immer auf diesem Gerät gestartet wird setzen wir noch ein Häckchen bei "Use same device for future launchs". Eclipse installiert jetzt automatisch die Anwendung und startet sie. Wir können unser Gerät jetzt wie die Emulatoren nutzen, nur eben ohne die Nachteile eines Emulators.


Sonntag, 18. August 2013

Android Emulator einrichten





Der Emulator
Der Android Emulator ist ein mächtiges Werkzeug zum testen und entwickeln von Android Apps. Während wir natürlich auch auf tatsächlicher Hardware testen können und sollten bietet uns der Emulator den entscheidenden Vorteil das wir hier auf vielen verschiedenen Android Versionen testen können um unsere Andwendungen möglichst kompatibel zu machen.
Der Emulator hat klar ein paar Vorteile aber er hat auch Nachteile. Dazu gehört z.b. das nicht jeder Code auf einem Emulator funktioniert, die Netzwerkkarten haben keine Mac-Adresse und er läuft furchtbar langsam. Dennoch ist es sehr sinnvoll sich einen Emulator einzurichten.

Emulator erstellen
Emulatoren werden über das Android SDK erstellt. Vorrausgesetzt wir haben mindestens ein System Image installiert können wir einfach den AVD Manager aus unserem Android SDK Ordner starten und darüber einen oder mehrere Emulatoren einrichten. Aufgerufen werden kann der AVD Manager aber auch direkt aus Eclipse heraus.






Starten wir den AVD Manager kann es einen Moment dauern bis wir das oben abgebildete Fenster sehen. Bei mir befindet sich schon ein Eintrag in der Liste, hat man noch keinen Emulator erstellt ist diese Liste leer. Um jetzt einen neuen Emulator einzurichten klicken wir einfach auf die Schaltfläche "New".


Wir haben dann dieses Fenster vor uns und können beginnen unseren Emulator unseren Wünschen anzupassen. Als erstes tragen wir bei "AVD Name" ein wie unser Emulator heißen soll. Erstellen wir nur einen kann das einfach Emulator oder sonst was sein. Haben wir mehrere mit unterschiedlichen Konfigurationen sollte man im Namen einen Hinweis einbauen um was genau es sich handelt.
Als nächstes kommt "Device". Hier wählen wir aus einer dropdown Liste aus welches Gerät emuliert werden soll. Wir können dabei zwischen vorgefertigten Geräten der Nexus Reihe wählen. Alle mit unterschiedlichen Auflösungen und Bildschirmgrößen. Hier entscheiden wir darüber ob wir eher ein Tablet wollen oder ein Smartphone. Wir können auch andere Konfigurationen wählen wie z.b. WXGA. Wichtig ist einfach zu wissen das wir hier die Auflösung und die Bilddiagonale in Zoll wählen.
Jetzt wählen wir unter "Target" noch aus welche Android Version wir benutzen wollen. Haben wir ein vorgefertigtes Gerät unter "Device" gewählt haben wir hier meistens schon einen Eintrag stehen. Man kann ihn aber verändern wie man es gerne hätte. Es kann dabei allerdings passieren das der Emulator später instabil läuft oder gar nicht erst startet und beim booten hängen bleibt. Ist das der Fall können wir entweder eine andere Android Version verwenden oder wir wechseln das Gerät.
Jetzt brauchen wir noch einen Prozessor für unseren Emulator. Je nachdem welche Komponenten wir in unserem SDK installiert haben tauchen unter "CPU/ABI" verschiedene Möglichkeiten auf. Ich empfehle die Verwendung des "ARM" Prozessors. Das ist auch der, der bei den meisten Smartphones verbaut ist.


 Wir haben jetzt noch die Möglichkeit zu entscheiden ob  wir ein Hardware Keyboard und Hardware Controls verwenden wollen. Hacken wir "Keyboards" und "Skin" an können wir die Home, Zurück, Menu etc. Tasten direkt benutzen. Das Hardware Keyboard ermöglicht uns unsere PC Tastatur zu verwenden um Eingaben zu tätigen.Ich finde das persönlich besser als die Software Tasten aber das ist reine Geschmackssache.
Über die Optionen "Front Camera" und "Back Camera" entscheiden wir noch ob wir auf unserem Emulator die entsprechenden Kameras verwenden wollen. Wir können hier wählen ob sie einfach nur emuliert werden soll oder ob eine am Rechner angeschlossene Webcam verwendet werden soll. Wird sie nur emuliert sieht man einfach irgendwelche Android Bilder als Kameraaufnahmen. Die Webcam funktion habe ich noch nie ausprobiert da ich keine Webcam habe aber ich kann mir vorstellen das es nicht besonders stabil oder einfach nur furchtbar langsam läuft. Aber das ist nur eine Mutmaßung.
Die "Memory Options" sind hier mit etwas Vorsicht zu genießen. Uns werden nach der Auswahl des Geräts hier bereits Werte vorgegeben die wir selbstverständlich anpassen können. Allerdings kann es passieren das wenn wir zu viel RAM benutzen das ganze System instabil läuft. Genauso verhält es sich mit zuwenig. Die VM Heap sollte immer einen Wert von 16, 32 oder 64 haben. Am besten ist es diesen Wert nur in wirklichen Ausnahmefällen zu verändern. Ich würde sogar empfehlen die Speicherwerte einfach so zu belassen wie sie sind.
Dagegen kann man den "Internal Storage" auf einen beliebigen Wert setzen. Man sollte nur daran denken das dieser Speicherplatz vom Emulator verbraucht wird. Und wie der Name schon sagt repräsentiert dieser Wert den internen Speicherplat der unserem Emulator zur verfügung steht.
Die "SD Card" Optionen sollten eigentlich selbsterklärend sein. Hier stellen wir einfach ein wie groß unsere SD Card ist die verwendet werden soll. Auch hier gilt wieder der Speicherplatz muss vorhanden sein. Aus stabilitäts Gründen sollte man gängige Größen verwenden. Hat man eine Datei die man als SD Card verwenden möchte kann man diese hier eintragen.
Als letztes haben wir noch die "Emulation Options". Hier kann man die "Snapshot" Option setzen. Diese Funktion ist dazu gedacht das der Emulator seinen aktuellen Zustand beim Beenden speichert und beim nächsten Start wieder lädt. Damit kann man das langwierige booten überspringen. Allerdings können dadurch auch Probleme auftreten. Man kann es probieren, wenns nicht funktioniert einfach wieder abschalten. Als letztes dann noch "Use Host GPU". Ist diese Funktion aktiviert versucht der Emulator die GPU des Rechners zu benutzen auf dem er läuft. Haut das hin steigert das die Performace des Emulators und wir können flüssiger arbeiten. Sollte man mal aktivieren und wenn es keine Probleme gibt auch benutzen.




Mein Emulator sieht jetzt aus wie auf dem Bild. Klicken wir jetzt auf "OK" sollte der AVD Manager uns einen neuen Emulator anlegen mit dem wir dann arbeiten können. Der Emulator erscheint dann in der Liste und über "Edit" können wir ihn nachträglich nocheinmal bearbeiten. Klicken wir auf "Start" können wir unseren Emulator auch direkt starten um zu gucken ob er auch läuft.





Nach dem starten erscheint das obige Fenster. Hier können wir noch einstellen ob wir die Displaygröße auf die original Größe skalieren wollen. Dazu setzen wir das Häkchen bei "Scale display to real size" und geben ein wie groß unser Bildschirm ist und auf welcher dpi Zahl er läuft. 96dpi ist hierbei der übliche Standart. Setzen wir "Wipe user data" wird alles was wir bisher in unserem Emulator gemacht haben zurückgesetzt. Wir sehen hier auch die "Launch from snapshot" und "Save to snapshot" Funktionen. Haben wir sie für unseren Emulator aktiviert können wir damit bestimmen ob wir unsere Emulator Session speichern und/oder laden wollen. Zum starten klicken wir jetzt einfach auf "Launch" und unser Emulator wird gestartet. In meinem Fall sieht das Ergebnis nach dem langen Bootvorgang dann so aus:





Das war auch schon. Jetzt können wir anfangen zu testen oder uns noch weitere Emulatoren hinzufügen. Wollen wir aus Eclipse heraus eine Anwendung starten kriegen wir eine Liste mit allen kompatiblen Emulatoren und Geräten angezeigt und wir können auswähen mit welchem wir starten wollen.

Android SDK installieren

Nachdem wir in den ersten Tutorials das Android SDK bereits benutzt haben möchte ich doch noch einmal etwas genauer darauf eingehen wie man es richtig installiert und welche Komponenten verwendet werden müssen.

Download
Zunächst einmal müssen wir uns das SDK herunterladen. Man kann es sich direkt im Bundle von Google laden. Da hätte man direkt auch Eclipse und einiges anderes mit dabei. Ich muss aber leider sagen das dieses Bundle bei mir so nicht funktioniert hat. Einzig die Eclipse Version ist ganz brauchbar. Stadtdessen empfehle ich den Download von Chip-Online. Hier bekommt man einen vernünftigen Installer und das ganze funktioniert am Ende auch sehr gut.
Wichtig ist das man vorher auf jeden Fall das Java SDK installieren muss. Falls es nicht vorhanden ist wird die Installation des Android SDK fehlschlagen! Außerdem muss man die 32bit Version des Java SDK verwenden! Wenn nach erfolgreicher Java installation immernoch ein Fehler auftritt habt ihr eventuell die 64bit Version von Java installiert. Die aktuellste Version von Java findet man hier. Benötigt wird das JDK - Windows x86.

Installation
Nach erfolgreichem Download einfach den Installer ausführen und das Android SDK an entsprechender Stelle installieren. Der Installationspfad ist nicht wirklich wichtig solange man ihn wieder findet. Man sollte nur beachten das keine Sonderzeichen in Ordnernamen auftauchen. Ich hatte mal das Problem das ein Ordner Umlaute wie Ö,Ä enthalten hat. Darauf hin lies sich das SDK nicht verwenden! Nach der Installation sollte man jetzt den SDK Manager starten.

Der SDK Manager
Mit dem SDK Manager verwalten wir unser SDK und damit unsere Entwicklungsumgebung. Hier entscheiden wir welche Tools, APIs und Android Versionen wir später verwenden wollen.
Den SDK Manager findet man immer im Installationsverzeichnis des Android SDK falls man keinen Starmenü Eintrag dazu haben sollte. Nach dem starten kann es durchaus einen Moment dauern bis sich das eigentliche Fenster öffnet, also nicht gleich verzweifeln wenn sich nicht sofort etwas tut. Falls im späteren Verlauf Probleme mit dem Manager auftauchen kann man versuchen den SDK Manager mit Administrator Rechten auszuführen. Je nach Installationspfad tauchen sonst Fehler wie "Access Denied" oder "Can't write..." etc. auf.






Wir sehen jetzt das oben abgebildete Fenster vor uns. Bei mir sieht es jetzt ein kleinwenig anders aus da ich breits alle Komponenten installiert habe die ich benötige. Der Unterschied zu einem "frischen" Manager ist aber nur das bei mir "Installed" steht und ansonsten da "Not Installed" steht. Wir können jetzt durch setzen der Häcken bestimmen welche Komponenten unser SDK enthalten soll.

Die Komponenten
Die einzelnen Komponenten hier sind alle mehr oder weniger wichtig, einige sogar erforderlich. Je nachdem was man vor hat muss man jetzt entscheiden welche der Komponenten installiert werden sollen. Klar, man kann auch einfach alles installieren aber damit müllt man sich wirklich zu und viele der Komponenten verbrauchen nicht grade wenig Speicherplatz. Ich empfehle daher nur zu installieren was man wirklich braucht und man hat ja jederzeit die Möglichkeit Komponenten hinzuzufügen oder zu entfernen.
Die Komponenten die wir auf jeden Fall benötigen sind zum ersten die "Tools" und zwar alle davon. Bei mir ist das direkt der erste Ordner. Falls dieser nicht bereits makiert ist tun wir dies in dem wir das Häckchen setzen.
Dann brauchen wir auf jeden Fall mindestens eine Android Version mit der wir arbeiten können. Besser sind aber mindestens 3 und zwar die die wir in unsere Projekte eintragen (Minimum, Target und Compile). Ich würde sogar noch mehr Empfehlen um später auf dem Emulator mit verschiedenen Versionen testen zu können. Es zeigt sich nämlich das siche jede Android Version sehr unterschiedlich verhalten kann. Bei den Android Versionen muss man aber nicht zwingend alles installieren. Hier mal eine Auflistung wozu die einzelnen Komponenten dienen:

Documentation - Das ist die Quellcode Dokumentation. Installieren wir diese erhalten wir zur jeder Funktion in unserem Code Tooltips die uns nähere Information zur Verwendung liefern. Das ist durchaus praktisch aber optional.
SDK Platform - Stellt uns die API dieser Android Version zur verfügung und ist zwingend erforderlich wenn wir für diese Version Anwendungen entwickeln.
xxx System Image - Das ist eine Image Datei die es uns ermöglicht diese Android Version im Emulator zu benutzen. Unbedingt nötig wenn wir vorhaben unsere Anwendungen auf dieser Version zu testen.
Google APIs - Stellt uns die Google API für diese Android Version zur verfügung. Damit können wir auf PlayStore oder Google Funktionen wie Konten, dem CloudMessageService ect. zugreifen. Brauchen wir nur wenn wir solche Funktionen nutzen wollen.
Sources for Android SDK - Das sind die Quellcodes des SDKs. Solange man damit nicht unbedingt arbeiten muss oder will brauchen wir diese eigentlich gar nicht.

Es gibt bei manchen Android Versionen auch noch weitere Komponenten die ich allerdings nicht alle erklären kann und will da wir sie so gut wie nie brauchen werden oder sie zu speziell sind. Falls da doch mal Bedarf besteht ist Google hier klar unser Freund.

Erwähnenswert sind allerdings noch die Komponenten im Extras Ordner. Hier bietet uns Google noch einige weitere Komponenten an mit denen wir Dinge wie AdMob, InAppBilling, GoogleAnalytics, Lizenz Funktionen usw. nutzen können. Wenn man das möchte dann einfach das Häkchen setzen. Praktisch hier ist aber auf jeden Fall der Intel x86 Emulator Accelerator mit dem wir die Performance unseres Emulators drastisch erhöhen können.

Komponenten installieren
Nachdem wir alle Komponenten ausgewählt haben die wir installieren wollen klicken wir einfach unten rechts auf "Install xxx". Daraufhin müssen wir dann noch für alle Komponenten die Lizenzvereinbarung akzeptieren und dann beginnt der SDK Manager auch schon damit alle ausgewählten Komponenten herunter zu laden und zu installieren. Danach haben wir unser Android SDK erfolgreich eingerichtet.

Updates
Es sind immer mal wieder Updates für einzelne Komponenten verfügbar bzw. gibt es gelegentlich auch ganz neue Komponenten. Um an diese Updates zu kommen reicht es in der Regel aus den SDK Manager zu starten. Er überprüft dann selbstständig ob Updates vorhanden sind.


Integration in Eclipse
Sollte Eclipse das SDK nicht automatisch erkennen sollte es uns darauf hinweisen das kein SDK vorhanden ist und uns darum bitten den Installationspfad anzugeben. Wir tragen dann einfach den Pfad ein der zu unserem Android SDK führt und Eclipse erkennt und integriert das SDK automatisch.

Samstag, 17. August 2013

Tutorial 2: Das erste Fenster erstellen (Pong-Projekt)

Einleitung
Ausgehend vom vorherigen Tutorial haben wir ein leeres Android Projekt vor uns und können nun beginnen das erste Fenster zu erstellen. Eclipse ist hierbei ein mächtiges Werkzeug mit dem wir sehr einfach und schnell die Benutzeroberfläche für unser Projekt erstellen können. Bevor wir jetzt aber einfach drauf los basteln hier noch schnell ein kurzer Umriss wie Fenster, die sogenannten Activitys, funktionieren.

Fenster in Android
Fenster, Bildschirme oder Screens, also die Benutzeroberfläche in Android nennt man "Activity". Eine Anwendung kann aus einer oder beliebig vieler Activitys bestehen.
Eine Activity besteht immer aus 2 Teilen: Einem Layout und der dazugehörigen Quellcode Datei. Das Layout kann etweder in einer XML Datei mit dem Eclipse Editor erstellt werden oder aber auch programmiertechnisch. Oft kommt auch eine kombination aus XML und programmiertem Design zum Einsatz.
Activitys haben einen Lebenszyklus: Sie werden erstellt, angehalten, fortgesetzt und beendet. Für jeden dieser Momente stellt uns Android eine Funktion bereit mit der wir entprechend darauf reagieren können.
Um eine Activity später aufrufen zu können oder zu bestimmen welche die "Main" Activity ist (die mit der die App starten soll) muss sie entsprechend in die Manifest.xml Datei eingetragen werden.

Erstellen eines Layouts
Wir erstellen zunächst ein Datei die unser Layout für das Hauptmenü erhält. Dazu öffnen wir in unserem Projekt den Order "res" und klicken mit der rechten Maustaste auf den Ordner "layout". Dann wählen wir "New" -> "File". Dort tragen wir unter "File name" den entsprechenden Namen ein den unser Layout erhalten soll. Ich habe hier "activity_main.xml" gewählt. Im Grunde spielt es keine rolle wie man die Datei bennent solange keine Sonderzeichen oder Großbuchstaben darin auftauchen und man das ".xml" nicht vergisst. Der Übersicht halber setzte bei Layouts die zu einer Activity gehören immer ein "activity_" davor. Das "main" soll mich immer daran erinner das dies das Layout ist mit dem die Anwendung startet. Wenn der Name eingegeben ist klicken wir auf "Finish" und wir finden sogleich eine neue Datei im Ordner "layout".




Eclipse sollte jetzt automatisch das Layout öffnen. Falls nicht reicht ein einfacher doppel Klick auf unsere eben erstellte Datei und der Layout Designer öffnet sich.
Vermutlich werden wir hier noch nicht viel sehen da unsere Datei noch keinen Inhalt hat. Wir können am unteren Rand des Designers zwei Reiter sehen einmal "Graphical Layout" und einmal "activity_main.xml". Wir klicken auf den 2. Reiter und öffnen damit die Textansicht des Layouts.


Um Eclipse jetzt mitzuteilen das es sich hierbei um eine XML Datei handelt die auch als solche interpretiert werden soll müssen wir jetzt die folgende Zeile einfügen:
<?xml version="1.0" encoding="utf-8"?>
Damit ein Layout auch dargestellt werden kann brauchen wir eine Art äußeren Container der bestimmt wie wir unsere späteren Steuerelemente anordnen wollen. Hierzu gibt es verschiedene Möglichkeiten:
  • LinearLayout
  • RelativeLayout
  • AbsolutLayout
Jedes dieser Layout Typen hat seine Vor- und Nachteile. Es gibt auch noch einige weitere wie Tabellen, Grids, Tabs etc. Aber diese hier sind die am meisten verwendeten. Layout Typen sind auch kombinier und verschachtelbar. Es ist also durchaus möglich als äußeren Container ein LinearLayout zu verwenden und darin mehrere RelativLayouts.
Bei einem LinearLayout werden alle Steuerelemente nacheinander in der Reihnfolge wie sie in unserer xml Datei stehen angezeigt während sie bei einem RelativLayout relativ zueinander Positioniert werden. Das AbsolutLayout ermöglicht dagegen freies Positionieren der Steuerelemente, ist aber aufgrund der verschiedenen Bildschirmgrößen und Auflösungen zu vermeiden. Wir wollen ja schließlich das unsere Anwendung überall gleich aussieht. Wir verwenden hier das RelativeLayout.

Um jetzt ein Layout mit entpsrechendem Typen einzufügen ergänzen wir unsere Datei um folgende Zeilen:
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
</RelativeLayout>
Wie wir sehen können ist der Syntax für das Layout recht simpel. Mit <RelativeLayout> leiten wir das Layout ein und mit </RelativeLayout> beenden wir. Alles was zwischen diesen beiden Zeilen liegt wird dann Element des Layouts und damit sichtbar sein. Auch weitere Layouts können eingefügt werden. Auf diese Weise sind selbst komplexeste Designs realisierbar.
Wichtig sind die Attribute die wir unserem Layout mit auf dem Weg geben. In unserem Fall xmlns:android, layout_width, layout_height. Wichtig ist das die Attribute in den eröffnungs Tag kommen.
Das erste Attribut das wir setzen "xmlns:android" ist äußerst wichtig und muss bei jedem Layout vorhanden sein das als äußerer Container dient.
Jedes Steuerelement besitzt eigene Attribute denen wir Werte zuweisen können. Sie müssen immer mit android: eingeleitet werden (außer wir schreiben eigene Steuerelemente aber dazu kommen wir erst viel später). Eclipse listet uns alle vorhanden Eigenschaften eines Elements auf wenn wir nur android: eingeben und kurz warten.

layout_width
Beschreibt wie breit unser Steuerlement sein soll. Mögliche Werte sind hier "FILL_PARENT" was nix anderes bedeutet als so breit wie das umschließende Element (hier der Bildschirm). Möglich ist aber auch "WRAP_CONTENT" was das Element veranlasst sich der Größe des Inhalts anzupassen. Nummerische Werte sind ebenfalls möglich wenn darauf die entsprechende Einheit folgt (layout_width="10px" z.b. bedeutet 10 Pixel breit).

layout_height
Funktioniert genauso nur eben mit der Höhe.





Haben wir unser Layout eingefügt und klicken nun wieder auf den Reiter "Graphical Layout" sehen wir eine Vorschau unseres Layouts. Je nach Eclipse, SDK Version sieht es nun bei jedem ein wenig unterschiedlich aus. Im Grunde sehen wir aber einfach nur einen leeren Bildschirm. Bei mir sieht es wie folgt aus:


Wirklich schön ist das nicht und wir wollen später möglichst keine Titelleiste sehen und um besten das Querformat (Landscape) benutzen. Um das zu bewerkstelligen müssen wir jetzt die Manifest.xml öffnen und dort ein paar änderungen vornehmen. Wir ersetzen den Application Tag mit folgendem:


<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
 </application>
Die entscheidende Änderung ist im android:theme Attribut passiert. Indem wir das Theme auf diesen Wert setzen startet unsere Anwendung und alle ihre Activitys im Vollbildmodus ohne Titelleiste. Nach dem speichern kehren wir zurück zu unserer "activity_main.xml" Jetzt sieht das ganze schon so aus:

Um jetzt in das Querformat zu kommen klicken wir einfach auf das kleine Symbol mit dem Gerät und dem runden Pfeil. Das dreht im Grunde nur unsere Anzeige hier. Auf dem tatsächlichen Gerät passt sich die Ausrichtung der Position des Geräts an. Wir werden das später noch deaktivieren. Ich möchte an dieser Stelle nocheinmal darauf hinweisen das es hier auch möglich ist ein Gerät auszuwählen in dem das Layout dargestellt werden soll. Das ist sehr nützlich um kleine Smartphones mit großen Tablets zu vergleichen und gegebenenfals das Design anzupassen.

Jetzt aber wieder zurück zu unserem Design. Wir wollen hier das Hauptmenü für unser Pong Projekt erstellen. Für den Moment werden wir es noch so simpel wie möglich halten. Wir werden folgendes benutzen: eine TextView um den Titel unseres Spiels anzuzeigen und 2 Buttons. Einen mit dem wir das Spiel starten und einen um eine Highscore Liste aufzurufen. Wie machen wir das am besten? Wir erstellen ein weiteres Layout nur diesmal ein LinearLayout. Dieses enthält dann unsere 2 Buttons und das gesamte Layout zentrieren wir dann auf dem Bildschirm. Der Text kommt dann an den oberen Bildschirmrand. Folgendermaßen sieht der Code in unserer activity_main.xml Datei jetzt aus:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
   
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_centerInParent="true"
        android:gravity="center">
       
        <Button
            android:id="@+id/main_button_play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Play"/>
       
        <Button
            android:id="@+id/main_button_highscore"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Highscore"/>
       
    </LinearLayout>
   
    <TextView
        android:id="@+id/main_text_headline"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="Pong Deluxe"
        android:textColor="#FFFFFF"
        android:textSize="25sp"
        android:gravity="center_horizontal"/>
   
</RelativeLayout>

Speichert man die Datei ab und schaut sich die Grafische Darstellung an sieht es jetzt folgendermaßen aus:


Sicherlich gewinnen wir damit keinen Design Preis aber es bietet uns die Möglichkeit uns einmal anzuschauen wie Steuerelemente angeordnet werden bevor es zu komplex und verwirrend wird.

Zunächst einmal die neuen Steuerelemente:

Button
Erstellt eine Schaltfläche die vom Benutzer später angeklickt werden kann. Neu hier ist das "id" Attribut. Dieses ist sehr sehr wichtig weil wir darüber später alle Benutzer Interaktionen abfragen werden. Wie man die id vergibt ist eigentlich egal aber um die Übersicht zu wahren sollte man sein eigenes System zum benennen verwenden. Wichtig ist nur das @+id/ vor der eigentlichen Id. Wieder schön zu sehen ist auch die layout_height und width Eigenschaft. Auf wrap_content gesetzt passt sich die Größe des Button dem Inhalt (hier der Text an).

TextView
Eine TextView ist für die Textausgabe verantwortlich. Wann immer wir dem Benutzer einen Text anzeigen wollen benutzen wir dieses Element. Es hat die selben Attribute id, layout_heigh und layout_width wie alle anderen Steuerelemente. Die letzten beiden müssen übrigens immer gesetzt sein! Um den Text zu formatieren verwenden wir textColor und textSize. Die Textfarbe wird Hexadezimal angegeben und die Größe mit einem Zahlenwert und der Einheit. Die Einheit des Textes sollte "sp" sein. Das steht für ScaledPixels und sorgt für eine gleichmäßige Größe bei verschiedenen Auflösungen. Um den Text an sich darzustellen verwendet man das Attribut "text". Ich habe hier direkt den Text dahinter geschrieben. Das ist aber so eigentlich nicht üblich. Normalerweise würde man den Text in die Strings.xml Datei schreiben und dann nur noch eine Referenz dazu verwenden. Das würde jetzt aber nur verwirren und kommt in einem späteren Tutorial. Das Attribut alignParentTop kommt vom Umgebenden RelativLayout und bedeutet das dieses Element an der oberen Kante des Umgebenden Elements ausgerichtet wird.

LinearLayout
Wie schon beschrieben können wir die Steuerelemente einfach nacheinander in die Datei schreiben und sie werden auch nacheinander angeordnet. Hierbei ist das "orientation" Attribut sehr wichtig da wir darüber bestimmen ob die Elemente nebeneinander oder übereinander angeordnet werden. mögliche Werte sind hier demnach "vertical" und "horizontal". Gleichzeitig sei hier das Attribut "gravity" erwähnt. Es bezieht sich immer auf den Inhalt eines Elements. Daher werden mit "center" alle Elemente des LinearLayouts zentriert und in der TextView z.b. der Text mit "center_horizontal" horizontal zentriert. Gleichzeitig sehen wir hier auch das Attribut centerInParent. Dieses Attribut kommt vom umgebenden RelativLayout und wird es auf true gesetzt wird dieses Element im Umgebenden zentriert.

Um zu verstehen was jedes der möglichen Attribute bewirkt empfiehlt es sich die Tooltips von Eclipse anzusehen. Ein Blick in die Android Dokumentation kann auch sehr hilfreich sein.


Die Programmierung
Bis hierher haben wirs geschafft ein Projekt zu erstellen und unser erstes Layout zu basteln. Das alleine nützt uns aber gänzlich wenig. Wir müssen jetzt den ersten Java Code schreiben um unsere Anwendung überhaupt zum laufen zu bringen.

Als erstes erstellen wir ein neues Package im src ordner. Dazu klicken wir mit der rechten Maustaste auf "src" -> "New" -> "Package". Als nächstes tragen wir in dem erscheinendem Fenster als Package Name den Package Namen unserer Anwendung ein (in meinem Fall "com.harbrannt.pong"). Danach klicken wir auf Finish.
Jetzt brauchen wir nur noch eine Quellcode Datei. Dazu klicken wir wieder rechts auf unser frisch erstelltes Package und wählen "New"->"File". Wir tragen den Namen ein den unsere Quellcode Datei bekommen soll. Ich habe "activity_main.java" gewählt. Für mich persönlich entsteht die beste Übersicht wenn das Layout und die Qullcode Datei den selben Namen haben. Aber auch hier kann man alles verwenden solange die Dateiendung ".java" ist. Hat man alles richtig gemacht sieht unsere Arbeitsfläche jetzt so aus.


Jetzt wird es Zeit ein bisschen Java Code in unsere activity_main.java zu schreiben. Grundkenntnisse in Java wären durchaus von Vorteil. Da Java aber relativ einfach zu lernen ist kommt man schnell dahinter wie es funktioniert wenn man eine Weile damit gearbeitet hat.

Als ersten geben wir das Package an in dem unsere Datei liegt und dann beginnt auch schon der Android Code. Zunächst machen wir nicht mehr als das Layout zu zuweisen nachdem unsere Activity gestartet wurde.

package com.hartbrannt.pong;

import android.app.Activity;
import android.os.Bundle;

public class activity_main extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
Da Java Objektorientiert ist, ist jede Activity in Android eine Klasse vom Typ Activity. Eine der Funktionen die uns diese Klasse zur verfügung stellt ist "onCreate" diese Funktion wird jedesmal dann aufgerufen wenn unsere Activity neu erstellt wird. Wir benutzen diese Funktion um unser Layout zu laden und das machen wir mit der Funktion "setContentView". Als Parameter übergeben wir einen Integer Wert. Diesen Wert erhalten wir über "R". R steht hier für alle Resourcen auf die wird in unserem Projekt zugreifen können. Das layout steht für unseren layout Ordner und activity_main für unsere XML Datei. Wichtig hier wird ohne Dateiendungen gearbeitet! Über unsere Resourcen "R" können wir auch auf alle weiteren Resourcen zugreifen wie z.b. Bilder im Drawable Ordner oder Strings aus unserer String.xml im values Ordner. Dazu aber an geeigneter Stelle mehr.
Wichtig hier ist auf jeden Fall das wir als allererstes in der Funktion onCreate "super.OnCreate" aufrufen. Damit teilen wir dem System mit das wir jetzt unseren eigenen Code zusätzlich ausführen wollen und alle benötigten Daten abgerufen werden. Lassen wir diese Zeile weg kommt es zu einem Fehler und es würde nur unser Code ausgeführt werden ohne alles das was Android noch im Hintergrund tut um die Activity zu starten.

Wenn es nur darum geht unser Layout anzuzeigen sind wir an diesem Punkt bereits fertig. Und mehr wollen wir in diesem Tutorial auch nicht behandeln. Im nächsten gehen wir dann einen Schritt weiter und behandeln wie man Benutzer Eingaben abfragt.

Bevor wir unsere App jetzt starten können müssen wir nur noch eine kleine Änderung in der Manifest.xml vornehmen damit Android weiß welche Activity es starten muss und überhaupt auf unsere Activity zugreifen kann.

Wir ergänzen unsere Manifest.xml Datei um folgende Zeilen im Application Tag:

<activity
            android:name=".activity_main"
            android:label="@string/app_name"
            android:screenOrientation="landscape">
            <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Der Activity Tag beschreibt eine Activity die wir in unserer Anwendung benutzen wollen. Für jede Activity die wir irgendwie starten wollen muss dieser Tag vorhanden sein. Wir geben als Namens Attribut den Namen unserer Quellcode Datei (oder genauer unserer Klasse die wir darin definiert haben) an mit einem vorrausgehenden Punk. Das Label Attribute representiert den Text der normalerweise in der Titelleiste erscheinen würde. Da wir keine haben geben wir hier einfach den App Namen an. Die screenOrientation ist ein optionaler Parameter der darüber entscheided wie unsere Activity ausgerichtet wird. Da wir gerne das Querformat benutzen möchten wählen wir hier "landdscape" das Gegenteil dazu wäre "portrai". Lässt man diesen Parameter weg entscheided der Benutzer darüber wie unsere Activity ausgerichtet wird.
Für jeden andere Activity bräuchten wir gar nicht mal mehr Code. Da wir allerdings mit dieser Activity starten wollen müssen wir noch einen sogenanntent Intent Filter angeben. Was genau das ist behandeln wir später. Für den Moment sollte reichen das dieser Filter hier dafür sorgt das unsere "activity_main" diejenige Activity ist mit der unsere Anwendung startet.



Jetzt sind wir soweit um unsere Anwendung zum ersten mal zu starten. Dazu klicken wir einfach auf den grünen Pfeil der aussieht wie ein "Play" Symbol. Dann wählen wir Android Application aus der Liste aus und schon kanns los gehen. Sollte keine Gerät über USB angeschlossen sein bei dem USB Debuggin aktiviert ist versucht Eclipse den Emulator zu starten. Sollte auch hier keiner vorhanden sein werden wir dazu aufgefordert einen neuen einzurichten. Das tun wir dann einfach und schon können wir unsere Anwendung starten.

Weiter gehts dann im nächsten Tutorial.

Tutorial 1: Ein Android Projekt erstellen (Pong-Projekt)

Einleitung
Das ist es also, mein erstes Tutorial. Für den Anfang nehmen wir uns einmal die Grundlagen vor und starten damit ein Android Projekt zu erstellen.

Wir beginnen mit einem kleinen Spiel namens "Pong". Das dürfte sicherlich jeder kennen.
Das Spielprinzip besteht darin einen kleinen Ball durch das gegnerischen Feld an den Rand den Spielfeldes zu bringen und/oder das zu verhindern. Die Spieler werden durch 2 einfache Balken an den Rändern des Spielfeldes repräsentiert und können sich nur nach oben oder unten bewegen. Nach einiger Zeit wird der Ball dann immer schneller. Er prallt von den Seitenwänden und den Spielern ab. Ziel des Spiels ist es als erster eine gewisse Punktzahl zu erreichen und so zu Gewinnen.


Das Projekt
Am Ende der ersten Tutorial Serie soll also eine spielbare Version von Pong rauskommen. Bevor es aber an komplexe Grafiken oder sonst was geht erstellen wir in diesem Tutorial zunächst einmal das Android Projekt in Eclipse. Im Nächsten Tutorial erstellen wir dann das erste Fenster, den Hauptbildschirm mit Funktionen wie "Spiel starten", "Highscore" etc.

Vorbereitungen
Bevor es losgehen kann benötigt man noch folgendes:
Bei der Installation spielt die Reinfolge eine wichtige Rolle, also erst Java, dann das SDK und dann Eclipse installieren. Nach der Installation des Android SDK muss man noch auswählen welche Tools man installieren möchte. Welche genau das sind hängt davon ab für welche Version von Android man Entwickeln will. Für genauere Hinweise wie und was man dort einstellen muss gibt es einige gute Anleitungen im Internet einfach mal googeln, das ist alles nicht sonderlich kompliziert. Startet man jetzt Eclipse und man erhält die Nachricht dass das SDK nicht gefunden wurde wählt man einfach den Installationspfad aus und alles sollte funktionieren.

Ist alles bereit und Eclipse gestartet sieht man folgendes Fenster vor sich:


Um jetzt ein Android Projekt zu erstellen gehen wir auf "File" -> "New" -> "Android Application Project".


Wir sehen jetzt folgendes Fenster in dem wir die grundlegenden Eigenschaften unseres Projekts festlegen:

Application Name: Der Name unserer Anwendung wie er dem Benutzer später angezeigt wird.
Project Name: Der Name des Projekts das wir anlegen. Eclipse benutzt ihn als Ordner Namen.
Package Name: Hier zeigt sich schon eine Eigenheit von Java. In Packages werden zusammengehörende Datein, Klassen, Eigenschaften etc. zussammengefasst. Über diesen Namen wird die Anwendung sozusagen identifiziert und alles was wir an Code schreiben wird über diesen Namen abrufbar sein. Man wählt hier normalerweise die Form "com.firmenname.anwendung". Dieser Name muss eindeutig und einmalig sein!

Minimu Required SDK: Gibt an welche die älteste Version ist auf der unsere Anwendung laufen soll.
Target SDK: Gibt an für welche Android Version wir die Anwendung konzipiert haben.
Compile With: Gibt an mit welcher Android Version unsere Anwendung erstellt werden soll. Man benutzt hier normalerweise die neuste Version.

Ist alles eingetragen klicken wir auf "Next".








Wir haben hier ein paar Möglichkeiten mit denen Eclipse uns anbietet den weiteren Entwicklungsverlauf einfacher zu gestalten. Dazu gehören die Funktionen:

Create custom launcher icon: Erlaubt uns ein Icon zu erstellen das dem Benutzer später unter seinen Apps angezeigt wird.
Create activity: Erstellt eine Activity in der wir direkt anfangen können zu programmieren. Mehr zu Activitys im nächsten Tutorial.
Mark this Project as Library: Falls wir nur eine Programmbibliothek erstellen wollen. Das wollen wir hier nicht da wir ja eine eigenständige Anwendung erstellen möchten.

Wir verwenden hier allerdings keine der oben genannten Punkte da Eclipse unter umständen Code einfügt den wir nicht wollen und nicht brauchen. Ausserdem bietet das eigene erstellen von Icon, Activity, etc. die Chance mehr zu lernen.
Wir müssen nur sicherstellen das das Häckchen bei "Create Project in Workspace" gesetzt ist.

Jetzt klicken wir auf  "Finish" und Eclipse erstellt ein neues Projekt für uns. Wir sehen das Projekt im Package Explorer auf der linken Seite als einen Ordner. Klappen wir diesen auf sieht es wie folgt aus. Um jetzt ein wirklich sauberes Projekt zu haben löschen wir jetzt noch die Ordner "lib", "values-v11" und "values-v14". Sind diese Ordner nicht vorhanden umso besser.






Wir haben jetzt ein leeres Projekt und können im nächsten Tutorial mit dem erstellen des ersten Fensters fortfahren.

Android Tutorials: Der Anfang


Was soll das ganze hier?
Ich habe vor einiger Zeit angefangen Android Apps zu schreiben und musste feststellen das die Entwicklung für Mobile Geräte eine ganz eigene Faszination ausüben kann. Vorher war ich eigentlich nie besonders daran interessiert mich mit Java und Android abzugeben, bis ich dann eines Tages mein erstes Android Smartphone in Händen hielt. Irgendwann merkte ich dann das es einige  mehr oder weniger gute Apps gibt aber auch viele die ihr Potential verspielt haben. Ich entschied mich dazu selbst mal Hand anzulegen und mich mit der Materie zu beschäftigen. Und schwup war mein Interesse geweckt. Die offene Struktur, die relativ einfach Programmierung mit Java und der Play Store an sich bieten einfach beste Vorraussetzungen der eigenen Kreativität freien lauf zu lassen. 

Gute Quellen und Tutorials zu finden ist auch gar nicht so schwer zumindest wenn man gewillt ist viele einzelne Teile zusammsen zu fügen und der Englischen Sprache mächtig ist. Ich musste allerdings auch oft feststellen das es nicht zu allem eine vorgefertigte Lösung gibt und man oft genug sich durch recht komplexe Probleme kämpfen muss deren Lösung am Ende doch recht Simpel gewesen wäre. Und genau darum geht es hier.

Wo soll es hin gehen?
Ich versuche hier kleine Tutorials, Anleitungen oder einfach nur Lösungen für Probleme bereit zu stellen. Ich werde das ganze in kleinen Projekten verpacken, versuchen das ganze abwechslungsreich zu gestalten und dafür zu sorgen das sowohl für die blutigen Anfänger als auch Fortgeschrittene etwas dabei ist.

Das Ziel des Ganzen ist es durch kleine Projekte und praxisnahe Orientierung die Grundlagen der Android Entwicklung zu vermitteln.

Ich wünsche jedem Interessierten viel Spaß!