Android: Unterschied zwischen den Versionen

Aus m-wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „* Fast alle Java-Klassen stehen zur Verfügung plus Verschlüsselung, HTTP, JSON, XML Bibliotheken\ * Keine main()-Funktion - stattdessen: lose gekoppelte…“)
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
* Fast alle [[Java]]-Klassen stehen zur Verfügung plus Verschlüsselung, HTTP, JSON, XML Bibliotheken\
= Einführung =
* Keine main()-Funktion - stattdessen: lose gekoppelte Komponenten, eine oder mehrere davon als Einstiegspunkt definierbar\
* Fast alle [[Java]]-Klassen stehen zur Verfügung plus Verschlüsselung, HTTP, JSON, XML Bibliotheken
* Wichtigste Komponente: "Activity" - entspricht einem sichtbaren Fenster auf dem Screen (Ähnlich wie Tabs eines Browsers). Man kann etwa ein Programm mit Screen 1 (Hauptseite) aufrufen oder direkt Screen 2 (Unterseite). Der Aufruf geschieht über die App-Icons.\
* Keine main()-Funktion - stattdessen: lose gekoppelte Komponenten, eine oder mehrere davon als Einstiegspunkt definierbar
== Entwicklungsumgebung ==\
* Wichtigste Komponente: "Activity" - entspricht einem sichtbaren Fenster auf dem Screen (Ähnlich wie Tabs eines Browsers). Man kann etwa ein Programm mit Screen 1 (Hauptseite) aufrufen oder direkt Screen 2 (Unterseite). Der Aufruf geschieht über die App-Icons.
Zum konkreten Einrichten siehe die [[Android#Links|Links]] zu den Tutorials (Link 2).\
 
* Eclipse herunterladen, entpacken und ins gewünschte Verzeichnis kopieren\
= Entwicklungsumgebung =
* "Android SDK Starter Package" herunterladen, installieren und starten\
Zum konkreten Einrichten siehe die [[Android#Links|Links]] zu den Tutorials (Link 2).
* die gewünschten Android Versionen und das Usb Driver Package anwählen und einrichten lassen\
* Eclipse herunterladen, entpacken und ins gewünschte Verzeichnis kopieren
* Im Android das "ADT (Android Development Tools) Eclipse Plugin" einrichten\
* "Android SDK Starter Package" herunterladen, installieren und starten
* Anschliessend kann ein neues Projekt erstellt werden\
* die gewünschten Android Versionen und das Usb Driver Package anwählen und einrichten lassen
=== Neues Projekt ===\
* Im Android das "ADT (Android Development Tools) Eclipse Plugin" einrichten
Mit dem ADT-Assistenten wird ein neues Projekt erstellt: <br />\
* Anschliessend kann ein neues Projekt erstellt werden
Wähle "File" → "New" → "Project..."; im "New Project"-Dialog wähle "Android Project" aus dem "Android" Order.\
 
<br />\
== Neues Projekt ==
\
Mit dem ADT-Assistenten wird ein neues Projekt erstellt: <br />
Füll den "New Android Project"-Dialog wie folgt aus:\
Wähle "File" → "New" → "Project..."; im "New Project"-Dialog wähle "Android Project" aus dem "Android" Order.
*Project name: "Hello Workshop"\
<br />
*Verwende die "default location" oder lege eine andere Location fest\
 
*Build target: Android 1.6 (für Kompatibilität mit älteren Versionen kann man später noch schauen)\
Füll den "New Android Project"-Dialog wie folgt aus:
*Application name: "Hello Workshop"\
*Project name: "Hello Workshop"
*Package name: "de.test.hello"\
*Verwende die "default location" oder lege eine andere Location fest
*Create Activity: "HelloWorkshopActivity"\
*Build target: Android 1.6 (für Kompatibilität mit älteren Versionen kann man später noch schauen)
*Min SDK Version: "4" \
*Application name: "Hello Workshop"
\
*Package name: "de.test.hello"
Klicke auf den "Finish"-Button.\
*Create Activity: "HelloWorkshopActivity"
\
*Min SDK Version: "4"  
=== Emulator ===\
 
Falls kein Andoid-Gerät vorhanden ist, oder das gewünschte Gerät fehlt.\
Klicke auf den "Finish"-Button.
\
 
Klicke auf das "Android SDK and AVD manager"-Icon in der Icon-Leiste von Eclipse. \
== Emulator ==
Klicke auf "New" \
Falls kein Andoid-Gerät vorhanden ist, oder das gewünschte Gerät fehlt.
Im "Create new AVD"-Dialog, gib folgendes ein:\
 
* Name: "G1"\
Klicke auf das "Android SDK and AVD manager"-Icon in der Icon-Leiste von Eclipse.
* Target: "Android 1.6 - API Level 4"\
Klicke auf "New"  
* SD Card Size: "1024" MiB\
Im "Create new AVD"-Dialog, gib folgendes ein:
* Skin: Built-in: "Default (HVGA)" \
* Name: "G1"
\
* Target: "Android 1.6 - API Level 4"
Dann klicke auf "Create AVD" (kann eine Weile - bis zu einigen Minuten - dauern) \
* SD Card Size: "1024" MiB
\
* Skin: Built-in: "Default (HVGA)"  
=== Verwendete Dateien ===\
 
Um die verwendeten Dateien zu sehen, muss man den Navigator einschalten. Diesen findet man unter Window -> Show View -> Navigator.\
Dann klicke auf "Create AVD" (kann eine Weile - bis zu einigen Minuten - dauern)
Falls man mehrere Projekte offen hat, zum gewünschten Projekt navigieren.\
 
{| class="wikitable"\
== Verwendete Dateien ==
|-\
Um die verwendeten Dateien zu sehen, muss man den Navigator einschalten. Diesen findet man unter Window -> Show View -> Navigator.
! Datei !! Beschreibung\
Falls man mehrere Projekte offen hat, zum gewünschten Projekt navigieren.
|-\
{| class="wikitable"
| HelloWorkshopActivity.java || Klasse der Haupt-Activity. Verweist mit setContentView(R.layout.main); auf das Layout, welches in der main.xml definiert wurde.\
|-
|-\
! Datei !! Beschreibung
| R.java || Resourcen-ID-Definitionen (automatisch erstellt, nicht editieren!)\
|-
|-\
| HelloWorkshopActivity.java || Klasse der Haupt-Activity. Verweist mit setContentView(R.layout.main); auf das Layout, welches in der main.xml definiert wurde.
|/assets || Ordner für Binär-Dateien (alles, was Android nicht selbst verwaltet)\
|-
|-\
| R.java || Resourcen-ID-Definitionen (automatisch erstellt, nicht editieren!)
|/res || Ordner für Resource-Dateien (Bilder, Layouts, Strings, ...)\
|-
|-\
|/assets || Ordner für Binär-Dateien (alles, was Android nicht selbst verwaltet)
|/res/drawable-hdpi/icon.png || Logo in hoher Auflösung (72 x 72 Pixel – 240 dpi)\
|-
|-\
|/res || Ordner für Resource-Dateien (Bilder, Layouts, Strings, ...)
|/res/drawable-ldpi/icon.png || Logo in niedriger Auflösung (36 x 36 Pixel – 120 dpi)\
|-
|-\
|/res/drawable-hdpi/icon.png || Logo in hoher Auflösung (72 x 72 Pixel – 240 dpi)
|/res/drawable-mdpi/icon.png || Logo in mittlerer Auflösung (48 x 48 Pixel – 160 dpi)\
|-
|-\
|/res/drawable-ldpi/icon.png || Logo in niedriger Auflösung (36 x 36 Pixel – 120 dpi)
|/res/layout/main.xml || Layout-Definition für die View der Haupt-Activity. Wird erstellt aus dem Namen, den man beim generieren des Projekts für das Layout wählt. Ohne Anpassung wird er aus dem Projektnamen gebildet.\
|-
|-\
|/res/drawable-mdpi/icon.png || Logo in mittlerer Auflösung (48 x 48 Pixel – 160 dpi)
|/res/values/strings.xml || String-Definitionen, welche im Programm oder anderen Dateien referenziert werden\
|-
|-\
|/res/layout/main.xml || Layout-Definition für die View der Haupt-Activity. Wird erstellt aus dem Namen, den man beim generieren des Projekts für das Layout wählt. Ohne Anpassung wird er aus dem Projektnamen gebildet.
|AndroidManifest.xml || "Manifest"-Datei, definiert Infos wie Name, Logo und Haupt-Activity\
|-
|-\
|/res/values/strings.xml || String-Definitionen, welche im Programm oder anderen Dateien referenziert werden
|default.properties || Projekt-Eigenschaften\
|-
|}\
|AndroidManifest.xml || "Manifest"-Datei, definiert Infos wie Name, Logo und Haupt-Activity
==== AndroidManifest.xml ====\
|-
Legt diverse Werte zum aussehen und verhalten des Programms fest. Siehe dazu auch Link 2 mit der Beschreibung der Standardeinträge.<br />\
|default.properties || Projekt-Eigenschaften
Folgende Einträge sind zusätzlich notwendig:\
|}
<pre>\
 
<supports-screens android:anyDensity="true"\
=== AndroidManifest.xml ===
                   android:largeScreens="true" \
Legt diverse Werte zum aussehen und verhalten des Programms fest. Siehe dazu auch Link 2 mit der Beschreibung der Standardeinträge.<br />
                   android:smallScreens="true" />\
Folgende Einträge sind zusätzlich notwendig:
</pre>\
<pre>
* anyDensity für hohe Auflösungen\
<supports-screens android:anyDensity="true"
* largeScreens bei grossen Displays\
                   android:largeScreens="true"  
* smallScreens für kleine Displays\
                   android:smallScreens="true" />
\
</pre>
Wenn man Eclipse verwendet, kann man aus den Warnungen ableiten, wenn man etwas falsch definiert. Dazu kann man entweder die Datei direkt bearbeiten oder dies über den Tab umstellen und manches direkt grafisch anpassen.\
* anyDensity für hohe Auflösungen
\
* largeScreens bei grossen Displays
==== HelloWorkshopActivity.java ====\
* smallScreens für kleine Displays
Enthält, wie unter [[Java#Programmierung|Programmierung]] gezeigt, das Hauptprogramm. Hier werden unter anderem die Elemente definiert.\
 
private Button hiButton;\
Wenn man Eclipse verwendet, kann man aus den Warnungen ableiten, wenn man etwas falsch definiert. Dazu kann man entweder die Datei direkt bearbeiten oder dies über den Tab umstellen und manches direkt grafisch anpassen.
private Button helloButton;\
 
\
=== HelloWorkshopActivity.java ===
==== strings.xml ====\
Enthält, wie unter [[Java#Programmierung|Programmierung]] gezeigt, das Hauptprogramm. Hier werden unter anderem die Elemente definiert.
Legt die Werte für die Strings fest. Hier wurden zwei Srings "hello" und "app_name" definiert, welche nun in anderen Dateien verwendet werden können (Layout oder Programm).\
private Button hiButton;
<pre>\
private Button helloButton;
<?xml version="1.0" encoding="utf-8"?>\
 
<resources>\
=== strings.xml ===
     <string name="hello">Hello World, HelloWorkshopActivity!</string>\
Legt die Werte für die Strings fest. Hier wurden zwei Srings "hello" und "app_name" definiert, welche nun in anderen Dateien verwendet werden können (Layout oder Programm).
     <string name="app_name">Hello Workshop</string>\
<pre>
</resources>\
<?xml version="1.0" encoding="utf-8"?>
</pre>\
<resources>
\
     <string name="hello">Hello World, HelloWorkshopActivity!</string>
== Programmierung ==\
     <string name="app_name">Hello Workshop</string>
Zuerst ein Beispiel, welches unten erklärt wird:\
</resources>
<pre>\
</pre>
class MyActivity extends Activity {\
 
\
= Programmierung =
   onCreate {\
Zuerst ein Beispiel, welches unten erklärt wird:
     View view = ... // erstellt den sichtbaren Teil\
<pre>
     setContentView(view);\
class MyActivity extends Activity {
     ...\
 
   } // end Eventhandler onCreate\
   onCreate {
\
     View view = ... // erstellt den sichtbaren Teil
   onClick {\
     setContentView(view);
     ...\
     ...
     Intent intent = ... // Zugriff auf externes Programm\
   } // end Eventhandler onCreate
     startActivity (intent);\
 
   } // end Eventhandler onClick\
   onClick {
\
     ...
} // end class MyActivity\
     Intent intent = ... // Zugriff auf externes Programm
</pre>\
     startActivity (intent);
=== Activity ===\
   } // end Eventhandler onClick
* definiert eine "View", zur Anzeige auf dem Screen\
 
* behandelt "Events" (z. B. Klick auf einen Button)\
} // end class MyActivity
* benutzt "Intents", um andere Activities zu starten \
</pre>
\
== Activity ==
=== View ===\
* definiert eine "View", zur Anzeige auf dem Screen
* eine "View" ist der sichtbare Teil der Activity\
* behandelt "Events" (z. B. Klick auf einen Button)
* definiert in einer XML-Layout-Datei (oder im Code) \
* benutzt "Intents", um andere Activities zu starten  
\
 
=== Events / Programmablauf ===\
== View ==
* werden ausgelöst, wenn etwas geschieht (z. B ein Button geklickt wird)\
* eine "View" ist der sichtbare Teil der Activity
* ruft eine Listener-Methode auf, sofern ein Listener definiert ist \
* definiert in einer XML-Layout-Datei (oder im Code)  
Ein Beispiel mit mehreren Events für einen Programmablauf sieht man hier: http://www.androidpit.de/de/android/wiki/view/Datei:Beginners_Workshop_Activity_LC.png <br />\
 
Um Datenverlust oder den Verlust des Zustands einer Activity zu vermeiden, müssen die Daten/der Zustand der Activity gesichert werden, wenn diese pausiert (nicht mehr im Vordergrund, aber noch sichtbar) oder gestoppt (nicht mehr sichtbar) wird. \
== Events / Programmablauf ==
\
* werden ausgelöst, wenn etwas geschieht (z. B ein Button geklickt wird)
==== onClick() ====\
* ruft eine Listener-Methode auf, sofern ein Listener definiert ist  
* Aufruf beim Drücken auf einen Button\
Ein Beispiel mit mehreren Events für einen Programmablauf sieht man hier: http://www.androidpit.de/de/android/wiki/view/Datei:Beginners_Workshop_Activity_LC.png <br />
<pre>\
Um Datenverlust oder den Verlust des Zustands einer Activity zu vermeiden, müssen die Daten/der Zustand der Activity gesichert werden, wenn diese pausiert (nicht mehr im Vordergrund, aber noch sichtbar) oder gestoppt (nicht mehr sichtbar) wird.  
EditText nameField = (EditText) findViewById(R.id.name_field);\
 
String name = nameField.getText().toString();\
=== onClick() ===
if (name.length() == 0) {\
* Aufruf beim Drücken auf einen Button
     new AlertDialog.Builder(this) \
<pre>
                   .setMessage(R.string.error_name_missing)\
EditText nameField = (EditText) findViewById(R.id.name_field);
                   .setNeutralButton(R.string.error_ok, null)\
String name = nameField.getText().toString();
                   .show();\
if (name.length() == 0) {
     return;\
     new AlertDialog.Builder(this)  
} // end if\
                   .setMessage(R.string.error_name_missing)
</pre>\
                   .setNeutralButton(R.string.error_ok, null)
\
                   .show();
==== onCreate() ====\
     return;
* wird einmalig beim Programmstart aufgerufen\
} // end if
* muss die View und die Elemente darin definieren\
</pre>
* springt anschliessend weiter nach onStart()\
 
* definiert die Listener-Aufrufe\
=== onCreate() ===
<pre>\
* wird einmalig beim Programmstart aufgerufen
hiButton = (Button)findViewById(R.id.hi_button);\
* muss die View und die Elemente darin definieren
hiButton.setOnClickListener(this);\
* springt anschliessend weiter nach onStart()
helloButton = (Button)findViewById(R.id.hello_button);\
* definiert die Listener-Aufrufe
helloButton.setOnClickListener(this);\
<pre>
</pre>\
hiButton = (Button)findViewById(R.id.hi_button);
\
hiButton.setOnClickListener(this);
==== onDestroy() ====\
helloButton = (Button)findViewById(R.id.hello_button);
* Wird nur aufgerufen, wenn das Programm explizit beendet wird\
helloButton.setOnClickListener(this);
\
</pre>
==== onPause() ====\
 
* Geht weiter nach onResume, wenn es wieder in den Vordergrund geholt wird oder nach onStop, wenn es gar nicht mehr sichtbar ist\
=== onDestroy() ===
* Da das Programm bei Speichermangel in diesem Zustand "abgeschossen" werden kann, müssen spätestens hier die Benutzerdaten gesichert werden\
* Wird nur aufgerufen, wenn das Programm explizit beendet wird
\
 
==== onRestart() ====\
=== onPause() ===
* Falls das Programm gestoppt wurde, doch noch nicht wegen Speichermangels aus dem RAM entfernt wurde und nun wieder in den Vordergrund kommt, wird diese Methode aufgerufen\
* Geht weiter nach onResume, wenn es wieder in den Vordergrund geholt wird oder nach onStop, wenn es gar nicht mehr sichtbar ist
* Springt anschliessend direkt nach onStart()\
* Da das Programm bei Speichermangel in diesem Zustand "abgeschossen" werden kann, müssen spätestens hier die Benutzerdaten gesichert werden
\
 
==== onResume() ====\
=== onRestart() ===
* Wird jedes Mal aufgerufen, wenn die App nach einer Pause (wieder) in den Vordergrund kommt\
* Falls das Programm gestoppt wurde, doch noch nicht wegen Speichermangels aus dem RAM entfernt wurde und nun wieder in den Vordergrund kommt, wird diese Methode aufgerufen
\
* Springt anschliessend direkt nach onStart()
==== onStart() ====\
 
* Springt weiter nach onResume()\
=== onResume() ===
\
* Wird jedes Mal aufgerufen, wenn die App nach einer Pause (wieder) in den Vordergrund kommt
==== onStop() ====\
 
* Wird aufgerufen, wenn das Programm nicht mehr sichtbar ist\
=== onStart() ===
* Je nach weiterer Folge, geht der Programmlauf weiter mit onDestroy oder onRestart.\
* Springt weiter nach onResume()
\
 
=== Intent === \
=== onStop() ===
* startet eine andere Activity ("öffnet ein neues Fenster")\
* Wird aufgerufen, wenn das Programm nicht mehr sichtbar ist
* kann Daten an die zu startende Activity übergeben\
* Je nach weiterer Folge, geht der Programmlauf weiter mit onDestroy oder onRestart.
* kann Activities aus anderen Apps starten!\
 
\
== Intent ==
=== Layouts und Elemente ===\
* startet eine andere Activity ("öffnet ein neues Fenster")
Wie oberhalb erwähnt, wird in /res/layout/main.xml das Layout der Hauptdatei festgelegt. Das heisst, hier werden die Elemente festgelegt. \
* kann Daten an die zu startende Activity übergeben
\
* kann Activities aus anderen Apps starten!
==== vertikale und horizontale Layouts ====\
 
Layouts können auch geschachtelt werden. Das Hauptlayout ist meist vertikal.\
== Layouts und Elemente ==
\
Wie oberhalb erwähnt, wird in /res/layout/main.xml das Layout der Hauptdatei festgelegt. Das heisst, hier werden die Elemente festgelegt.
Vertikales Layout mit einem Titel:\
 
<pre>\
=== vertikale und horizontale Layouts ===
<?xml version="1.0" encoding="utf-8"?>\
Layouts können auch geschachtelt werden. Das Hauptlayout ist meist vertikal.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\
 
   android:orientation="vertical"\
Vertikales Layout mit einem Titel:
   android:layout_width="fill_parent"\
<pre>
   android:layout_height="fill_parent"\
<?xml version="1.0" encoding="utf-8"?>
>\
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   <TextView  \
   android:orientation="vertical"
     android:layout_width="fill_parent" \
   android:layout_width="fill_parent"
     android:layout_height="wrap_content" \
   android:layout_height="fill_parent"
     android:text="@string/hello"\
>
   />\
   <TextView   
</LinearLayout>\
     android:layout_width="fill_parent"  
</pre>\
     android:layout_height="wrap_content"  
Der Inhalt des Strings wird in der [[Android#strings.xml|/res/layout/strings.xml]] definiert\
     android:text="@string/hello"
\
   />
Horizontales Layout mit zwei Knöpfen.\
</LinearLayout>
<pre>\
</pre>
<LinearLayout \
Der Inhalt des Strings wird in der [[Android#strings.xml|/res/layout/strings.xml]] definiert
     android:orientation="horizontal"\
 
     android:layout_width="fill_parent"\
Horizontales Layout mit zwei Knöpfen.
     android:layout_height="wrap_content"\
<pre>
     >\
<LinearLayout  
     <Button \
     android:orientation="horizontal"
         android:id="@+id/hi_button"\
     android:layout_width="fill_parent"
         android:layout_width="wrap_content"\
     android:layout_height="wrap_content"
         android:layout_height="wrap_content"\
     >
         android:layout_weight="1"\
     <Button  
         android:text="@string/hi_button" \
         android:id="@+id/hi_button"
         />\
         android:layout_width="wrap_content"
     <Button \
         android:layout_height="wrap_content"
         android:id="@+id/hello_button"\
         android:layout_weight="1"
         android:layout_width="wrap_content"\
         android:text="@string/hi_button"  
         android:layout_height="wrap_content"\
         />
         android:layout_weight="1"\
     <Button  
         android:text="@string/hello_button" \
         android:id="@+id/hello_button"
         />\
         android:layout_width="wrap_content"
</LinearLayout>\
         android:layout_height="wrap_content"
</pre>\
         android:layout_weight="1"
\
         android:text="@string/hello_button"  
==== TextView (Label) ====\
         />
<pre>\
</LinearLayout>
<TextView \
</pre>
     android:layout_width="fill_parent" \
 
     android:layout_height="wrap_content" \
=== TextView (Label) ===
     android:layout_marginTop="20dp"\
<pre>
     android:text="@string/enter_your_name"\
<TextView
/>\
     android:layout_width="fill_parent"  
</pre>\
     android:layout_height="wrap_content"  
Hier müssten wir noch den String "enter_your_name" in der strings.xml definieren.\
     android:layout_marginTop="20dp"
\
     android:text="@string/enter_your_name"
==== EditText (Eingabefeld) ====\
/>
<pre>\
</pre>
<EditText\
Hier müssten wir noch den String "enter_your_name" in der strings.xml definieren.
     android:id="@+id/name_field"\
 
     android:layout_width="fill_parent" \
=== EditText (Eingabefeld) ===
     android:layout_height="wrap_content" \
<pre>
/>\
<EditText
</pre>\
     android:id="@+id/name_field"
Hier bekommt das Feld eine id("name_field"), welche man später im Programm verwenden kann, um den Wert auszulesen.\
     android:layout_width="fill_parent"  
\
     android:layout_height="wrap_content"  
==== Button (Knopf) ====\
/>
<pre>\
</pre>
<Button \
Hier bekommt das Feld eine id("name_field"), welche man später im Programm verwenden kann, um den Wert auszulesen.
     android:id="@+id/hi_button"\
 
     android:layout_width="wrap_content"\
=== Button (Knopf) ===
     android:layout_height="wrap_content"\
<pre>
     android:layout_weight="1"\
<Button  
     android:text="@string/hi_button" \
     android:id="@+id/hi_button"
/>\
     android:layout_width="wrap_content"
</pre>\
     android:layout_height="wrap_content"
Der Knopf braucht neben der Beschriftung, welche in der strings.xml definiert wird, noch eine id, welche wieder im Programm über ein [[Java#Events|Event]] ausgewertet werden kann.\
     android:layout_weight="1"
\
     android:text="@string/hi_button"  
=== Programmierbeispiel komplett ===\
/>
Wenn man ein Android-Projekt unter Eclipse erstellt, so generiert Eclipse mehrere [[Android#Verwendete Dateien|Dateien]]. Hier werden nun alphabetisch alle Dateien aufgeführt, welche im [[Android#Entwicklungsumgebung|Beispielprojekt]] manuell angepasst wurden.\
</pre>
  \
Der Knopf braucht neben der Beschriftung, welche in der strings.xml definiert wird, noch eine id, welche wieder im Programm über ein [[Java#Events|Event]] ausgewertet werden kann.
==== AndroidManifest.xml ====\
 
<pre>\
== Programmierbeispiel komplett ==
<?xml version="1.0" encoding="utf-8"?>\
Wenn man ein Android-Projekt unter Eclipse erstellt, so generiert Eclipse mehrere [[Android#Verwendete Dateien|Dateien]]. Hier werden nun alphabetisch alle Dateien aufgeführt, welche im [[Android#Entwicklungsumgebung|Beispielprojekt]] manuell angepasst wurden.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"\
   
     package="com.example.helloworkshop"\
==== AndroidManifest.xml ====
     android:versionCode="1"\
<pre>
     android:versionName="1.0" >\
<?xml version="1.0" encoding="utf-8"?>
\
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     <uses-sdk\
     package="com.example.helloworkshop"
         android:minSdkVersion="8"\
     android:versionCode="1"
         android:targetSdkVersion="16" />\
     android:versionName="1.0" >
     \
 
     <supports-screens \
     <uses-sdk
    \ android:anyDensity="true"\
         android:minSdkVersion="8"
         android:largeScreens="true" \
         android:targetSdkVersion="16" />
         android:smallScreens="true" />\
      
      \ \
     <supports-screens  
     <application\
        android:anyDensity="true"
         android:allowBackup="true"\
         android:largeScreens="true"  
         android:icon="@drawable/ic_launcher"\
         android:smallScreens="true" />
         android:label="@string/app_name"\
 
         android:theme="@style/AppTheme" >\
     <application
         <activity\
         android:allowBackup="true"
             android:name="com.example.helloworkshop.HelloWorkshopActivity"\
         android:icon="@drawable/ic_launcher"
             android:label="@string/app_name" >\
         android:label="@string/app_name"
             <intent-filter>\
         android:theme="@style/AppTheme" >
                 <action android:name="android.intent.action.MAIN" />\
         <activity
\
             android:name="com.example.helloworkshop.HelloWorkshopActivity"
                 <category android:name="android.intent.category.LAUNCHER" />\
             android:label="@string/app_name" >
             </intent-filter>\
             <intent-filter>
         </activity>\
                 <action android:name="android.intent.action.MAIN" />
     </application>\
 
\
                 <category android:name="android.intent.category.LAUNCHER" />
</manifest>\
             </intent-filter>
</pre>\
         </activity>
\
     </application>
==== HelloWorkshopActivity.java ====\
 
<pre>\
</manifest>
package com.example.helloworkshop;\
</pre>
\
 
import android.app.Activity;\
=== HelloWorkshopActivity.java ===
import android.app.AlertDialog;\
<pre>
import android.os.Bundle;\
package com.example.helloworkshop;
import android.view.Menu;\
 
import android.view.View;\
import android.app.Activity;
import android.view.View.OnClickListener;\
import android.app.AlertDialog;
import android.widget.Button;\
import android.os.Bundle;
import android.widget.EditText;\
import android.view.Menu;
import android.widget.TextView;\
import android.view.View;
import android.widget.Toast;\
import android.view.View.OnClickListener;
\
import android.widget.Button;
\
import android.widget.EditText;
public class HelloWorkshopActivity extends Activity implements OnClickListener {\
import android.widget.TextView;
\
import android.widget.Toast;
\ private Button hiButton;\
 
\ private Button helloButton;\
 
\
public class HelloWorkshopActivity extends Activity implements OnClickListener {
     @Override\
 
     protected void onCreate(Bundle savedInstanceState) {\
private Button hiButton;
         super.onCreate(savedInstanceState);\
private Button helloButton;
         setContentView(R.layout.main);\
 
         \
     @Override
         hiButton = (Button)findViewById(R.id.hi_button);\
     protected void onCreate(Bundle savedInstanceState) {
         hiButton.setOnClickListener(this);\
         super.onCreate(savedInstanceState);
         \
         setContentView(R.layout.main);
         helloButton = (Button)findViewById(R.id.hello_button);\
          
         helloButton.setOnClickListener(this);\
         hiButton = (Button)findViewById(R.id.hi_button);
     } // end onCreate\
         hiButton.setOnClickListener(this);
\
          
     @Override\
         helloButton = (Button)findViewById(R.id.hello_button);
     public boolean onCreateOptionsMenu(Menu menu) {\
         helloButton.setOnClickListener(this);
         // Inflate the menu; this adds items to the action bar if it is present.\
     } // end onCreate
         getMenuInflater().inflate(R.menu.hello_workshop, menu);\
 
         return true;\
     @Override
     } // end onCreateOptionsMenu\
     public boolean onCreateOptionsMenu(Menu menu) {
    \
         // Inflate the menu; this adds items to the action bar if it is present.
     public void onClick(View v) {\
         getMenuInflater().inflate(R.menu.hello_workshop, menu);
         EditText nameField = (EditText) findViewById(R.id.name_field);\
         return true;
        \
     } // end onCreateOptionsMenu
         String name = nameField.getText().toString();\
 
\
     public void onClick(View v) {
         if (name.length() == 0) {\
         EditText nameField = (EditText) findViewById(R.id.name_field);
             new AlertDialog.Builder(this).setMessage(\
 
                     R.string.error_name_missing).setNeutralButton(\
         String name = nameField.getText().toString();
                     R.string.error_ok,\
 
                     null).show();\
         if (name.length() == 0) {
             return;\
             new AlertDialog.Builder(this).setMessage(
         }\
                     R.string.error_name_missing).setNeutralButton(
\
                     R.string.error_ok,
         if (v == hiButton || v == helloButton) {\
                     null).show();
             int resourceId = v == hiButton ? R.string.hi_greeting\
             return;
                     : R.string.hello_greeting;\
         }
\
 
             String greeting = getResources().getString(resourceId, name);\
         if (v == hiButton || v == helloButton) {
             Toast.makeText(this, greeting, Toast.LENGTH_LONG).show();\
             int resourceId = v == hiButton ? R.string.hi_greeting
\
                     : R.string.hello_greeting;
             TextView greetingField = (TextView) findViewById(R.id.greeting_field);\
 
             greetingField.setText(greeting);\
             String greeting = getResources().getString(resourceId, name);
         }\
             Toast.makeText(this, greeting, Toast.LENGTH_LONG).show();
     } // end onClick\
 
     \
             TextView greetingField = (TextView) findViewById(R.id.greeting_field);
} // end class HelloWorkshopActivity\
             greetingField.setText(greeting);
</pre>\
         }
\
     } // end onClick
==== main.xml ====\
      
<pre>\
} // end class HelloWorkshopActivity
<?xml version="1.0" encoding="utf-8"?>\
</pre>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"\
 
     android:orientation="vertical"\
=== main.xml ===
     android:layout_width="fill_parent"\
<pre>
     android:layout_height="fill_parent"\
<?xml version="1.0" encoding="utf-8"?>
     >\
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    \
     android:orientation="vertical"
\ <TextView  \
     android:layout_width="fill_parent"
    \ android:id="@+id/greeting_field"\
     android:layout_height="fill_parent"
\     android:layout_width="fill_parent" \
     >
\     android:layout_height="wrap_content" \
 
\     android:text="@string/hello"\
<TextView   
\ />\
    android:id="@+id/greeting_field"
\ \
    android:layout_width="fill_parent"  
\ <TextView \
    android:layout_height="wrap_content"  
\     android:layout_width="fill_parent" \
    android:text="@string/hello"
\     android:layout_height="wrap_content" \
/>
\     android:layout_marginTop="20dp"\
 
\     android:text="@string/enter_your_name"\
<TextView  
     />\
    android:layout_width="fill_parent"  
\ \
    android:layout_height="wrap_content"  
\ <EditText\
    android:layout_marginTop="20dp"
\     android:id="@+id/name_field"\
    android:text="@string/enter_your_name"
\     android:layout_width="fill_parent" \
     />
\     android:layout_height="wrap_content" \
\ >\
<EditText
\ </EditText>\
    android:id="@+id/name_field"
\ \
    android:layout_width="fill_parent"  
\ <LinearLayout \
    android:layout_height="wrap_content"  
\     android:orientation="horizontal"\
>
\     android:layout_width="fill_parent"\
</EditText>
\     android:layout_height="wrap_content"\
     >\
<LinearLayout  
\     <Button \
    android:orientation="horizontal"
\         android:id="@+id/hi_button"\
    android:layout_width="fill_parent"
\         android:layout_width="wrap_content"\
    android:layout_height="wrap_content"
\         android:layout_height="wrap_content"\
     >
\         android:layout_weight="1"\
    <Button  
\         android:text="@string/hi_button" \
        android:id="@+id/hi_button"
\     />\
        android:layout_width="wrap_content"
\     <Button \
        android:layout_height="wrap_content"
\         android:id="@+id/hello_button"\
        android:layout_weight="1"
\         android:layout_width="wrap_content"\
        android:text="@string/hi_button"  
\         android:layout_height="wrap_content"\
    />
\         android:layout_weight="1"\
    <Button  
\         android:text="@string/hello_button" \
        android:id="@+id/hello_button"
\     />\
        android:layout_width="wrap_content"
\ </LinearLayout>\
        android:layout_height="wrap_content"
\
        android:layout_weight="1"
</LinearLayout>\
        android:text="@string/hello_button"  
</pre>\
    />
\
</LinearLayout>
==== strings.xml ====\
 
<pre>\
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>\
</pre>
<resources>\
 
     <string name="action_settings">Settings</string>\
=== strings.xml ===
     <string name="app_name">Hello Workshop</string>\
<pre>
     <string name="enter_your_name">Gib bitte Deinen Namen ein:</string>\
<?xml version="1.0" encoding="utf-8"?>
\ <string name="error_name_missing">Please enter your name.</string>\
<resources>
\ <string name="error_ok">OK</string>\
     <string name="action_settings">Settings</string>
     <string name="hello">Hallo Welt Workshop!</string>\
     <string name="app_name">Hello Workshop</string>
\ <string name="hello_button">Say Hello!</string>\
     <string name="enter_your_name">Gib bitte Deinen Namen ein:</string>
\ <string name="hello_greeting">Hello %s!</string>\
    <string name="error_name_missing">Please enter your name.</string>
     <string name="hi_button">Say Hi!</string>\
    <string name="error_ok">OK</string>
\ <string name="hi_greeting">Hi %s!</string>\
     <string name="hello">Hallo Welt Workshop!</string>
</resources>\
    <string name="hello_button">Say Hello!</string>
</pre>\
    <string name="hello_greeting">Hello %s!</string>
== Programm auf Gerät verschieben ==\
     <string name="hi_button">Say Hi!</string>
=== Mittels Google-Konto ===\
    <string name="hi_greeting">Hi %s!</string>
# Im Ordner bin/res befindet sich die Datei "Projektname.apk". Diese ist die notwendige Datei.\
</resources>
# Die Datei als Anhnag ans Google-Konto senden\
</pre>
# Den Anhang im Gerät anwählen und danach installieren. Will das Gerät dies nicht, kann evtl. das Programm AKPatcher verwendet werden (hat bei mir aber immer nur den Info-Screen angezeigt)\
 
# Anschliessend kann die App übers App-Menü gestartet werden\
= Programm auf Gerät verschieben =
\
== Mittels Google-Konto ==
=== Mittels USB-Verbindung ===\
# Im Ordner bin/res befindet sich die Datei "Projektname.apk". Diese ist die notwendige Datei.
Folgende Bildergalerie verwenden:\
# Die Datei als Anhnag ans Google-Konto senden
http://www.chip.de/bildergalerie/So-geht-s-APKs-via-USB-installieren-Galerie_56637615.html\
# Den Anhang im Gerät anwählen und danach installieren. Will das Gerät dies nicht, kann evtl. das Programm AKPatcher verwendet werden (hat bei mir aber immer nur den Info-Screen angezeigt)
# Einstellung: Unbekannte Quellen zulassen\
# Anschliessend kann die App übers App-Menü gestartet werden
# Verbinden im Massenspeicher Modus\
 
# APK-Datei auf das Gerät in den gewünschten Ordner kopieren \
== Mittels USB-Verbindung ==
# Mit dem Dateimanager ins obige Verzeichnis navigieren und die Datei anwählen und installieren\
Folgende Bildergalerie verwenden:
\
http://www.chip.de/bildergalerie/So-geht-s-APKs-via-USB-installieren-Galerie_56637615.html
== Links ==\
# Einstellung: Unbekannte Quellen zulassen
{| class="wikitable"\
# Verbinden im Massenspeicher Modus
|-\
# APK-Datei auf das Gerät in den gewünschten Ordner kopieren  
! Link !! Beschreibung !! Niveau\
# Mit dem Dateimanager ins obige Verzeichnis navigieren und die Datei anwählen und installieren
|-\
 
| [[Java|Java]] || Java-Wiki || Anfänger\
= Links =
|-\
{| class="wikitable"
| http://www.androidpit.de/de/android/wiki/view/Android_Anf%C3%A4nger_Workshop || Android-Einführungstutorial deutsch || Anfänger\
|-
|-\
! Link !! Beschreibung !! Niveau
| http://www.vogella.com/articles/Android/article.html || Android-Einführungstutorial englisch || Anfänger-Fortgeschrittene\
|-
|-\
| [[Java|Java]] || Java-Wiki || Anfänger
| http://www.makeuseof.com/tag/write-google-android-application/ || Android erste Applikation von Google englisch || Anfänger\
|-
|-\
| http://www.androidpit.de/de/android/wiki/view/Android_Anf%C3%A4nger_Workshop || Android-Einführungstutorial deutsch || Anfänger
| http://www.kammerath.net/android-app-programmieren.html || Android app programmieren deutsch || Anfänger\
|-
|-\
| http://www.vogella.com/articles/Android/article.html || Android-Einführungstutorial englisch || Anfänger-Fortgeschrittene
| http://www.vogella.com/articles/AndroidIntent/article.html || Android Intents englisch || Fortgeschrittene\
|-
|}\
| http://www.makeuseof.com/tag/write-google-android-application/ || Android erste Applikation von Google englisch || Anfänger
|-
| http://www.kammerath.net/android-app-programmieren.html || Android app programmieren deutsch || Anfänger
|-
| http://www.vogella.com/articles/AndroidIntent/article.html || Android Intents englisch || Fortgeschrittene
|}
[[Kategorie:Computer]][[Kategorie:Programmierung]]
[[Kategorie:Computer]][[Kategorie:Programmierung]]

Version vom 29. Februar 2020, 00:53 Uhr

Einführung

  • Fast alle Java-Klassen stehen zur Verfügung plus Verschlüsselung, HTTP, JSON, XML Bibliotheken
  • Keine main()-Funktion - stattdessen: lose gekoppelte Komponenten, eine oder mehrere davon als Einstiegspunkt definierbar
  • Wichtigste Komponente: "Activity" - entspricht einem sichtbaren Fenster auf dem Screen (Ähnlich wie Tabs eines Browsers). Man kann etwa ein Programm mit Screen 1 (Hauptseite) aufrufen oder direkt Screen 2 (Unterseite). Der Aufruf geschieht über die App-Icons.

Entwicklungsumgebung

Zum konkreten Einrichten siehe die Links zu den Tutorials (Link 2).

  • Eclipse herunterladen, entpacken und ins gewünschte Verzeichnis kopieren
  • "Android SDK Starter Package" herunterladen, installieren und starten
  • die gewünschten Android Versionen und das Usb Driver Package anwählen und einrichten lassen
  • Im Android das "ADT (Android Development Tools) Eclipse Plugin" einrichten
  • Anschliessend kann ein neues Projekt erstellt werden

Neues Projekt

Mit dem ADT-Assistenten wird ein neues Projekt erstellt:
Wähle "File" → "New" → "Project..."; im "New Project"-Dialog wähle "Android Project" aus dem "Android" Order.

Füll den "New Android Project"-Dialog wie folgt aus:

  • Project name: "Hello Workshop"
  • Verwende die "default location" oder lege eine andere Location fest
  • Build target: Android 1.6 (für Kompatibilität mit älteren Versionen kann man später noch schauen)
  • Application name: "Hello Workshop"
  • Package name: "de.test.hello"
  • Create Activity: "HelloWorkshopActivity"
  • Min SDK Version: "4"

Klicke auf den "Finish"-Button.

Emulator

Falls kein Andoid-Gerät vorhanden ist, oder das gewünschte Gerät fehlt.

Klicke auf das "Android SDK and AVD manager"-Icon in der Icon-Leiste von Eclipse. Klicke auf "New" Im "Create new AVD"-Dialog, gib folgendes ein:

  • Name: "G1"
  • Target: "Android 1.6 - API Level 4"
  • SD Card Size: "1024" MiB
  • Skin: Built-in: "Default (HVGA)"

Dann klicke auf "Create AVD" (kann eine Weile - bis zu einigen Minuten - dauern)

Verwendete Dateien

Um die verwendeten Dateien zu sehen, muss man den Navigator einschalten. Diesen findet man unter Window -> Show View -> Navigator. Falls man mehrere Projekte offen hat, zum gewünschten Projekt navigieren.

Datei Beschreibung
HelloWorkshopActivity.java Klasse der Haupt-Activity. Verweist mit setContentView(R.layout.main); auf das Layout, welches in der main.xml definiert wurde.
R.java Resourcen-ID-Definitionen (automatisch erstellt, nicht editieren!)
/assets Ordner für Binär-Dateien (alles, was Android nicht selbst verwaltet)
/res Ordner für Resource-Dateien (Bilder, Layouts, Strings, ...)
/res/drawable-hdpi/icon.png Logo in hoher Auflösung (72 x 72 Pixel – 240 dpi)
/res/drawable-ldpi/icon.png Logo in niedriger Auflösung (36 x 36 Pixel – 120 dpi)
/res/drawable-mdpi/icon.png Logo in mittlerer Auflösung (48 x 48 Pixel – 160 dpi)
/res/layout/main.xml Layout-Definition für die View der Haupt-Activity. Wird erstellt aus dem Namen, den man beim generieren des Projekts für das Layout wählt. Ohne Anpassung wird er aus dem Projektnamen gebildet.
/res/values/strings.xml String-Definitionen, welche im Programm oder anderen Dateien referenziert werden
AndroidManifest.xml "Manifest"-Datei, definiert Infos wie Name, Logo und Haupt-Activity
default.properties Projekt-Eigenschaften

AndroidManifest.xml

Legt diverse Werte zum aussehen und verhalten des Programms fest. Siehe dazu auch Link 2 mit der Beschreibung der Standardeinträge.
Folgende Einträge sind zusätzlich notwendig:

<supports-screens android:anyDensity="true"
                  android:largeScreens="true" 
                  android:smallScreens="true" />
  • anyDensity für hohe Auflösungen
  • largeScreens bei grossen Displays
  • smallScreens für kleine Displays

Wenn man Eclipse verwendet, kann man aus den Warnungen ableiten, wenn man etwas falsch definiert. Dazu kann man entweder die Datei direkt bearbeiten oder dies über den Tab umstellen und manches direkt grafisch anpassen.

HelloWorkshopActivity.java

Enthält, wie unter Programmierung gezeigt, das Hauptprogramm. Hier werden unter anderem die Elemente definiert. private Button hiButton; private Button helloButton;

strings.xml

Legt die Werte für die Strings fest. Hier wurden zwei Srings "hello" und "app_name" definiert, welche nun in anderen Dateien verwendet werden können (Layout oder Programm).

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, HelloWorkshopActivity!</string>
    <string name="app_name">Hello Workshop</string>
</resources>

Programmierung

Zuerst ein Beispiel, welches unten erklärt wird:

class MyActivity extends Activity {

  onCreate {
    View view = ... // erstellt den sichtbaren Teil
    setContentView(view);
    ...
  } // end Eventhandler onCreate

  onClick {
    ...
    Intent intent = ... // Zugriff auf externes Programm
    startActivity (intent);
  } // end Eventhandler onClick

} // end class MyActivity

Activity

  • definiert eine "View", zur Anzeige auf dem Screen
  • behandelt "Events" (z. B. Klick auf einen Button)
  • benutzt "Intents", um andere Activities zu starten

View

  • eine "View" ist der sichtbare Teil der Activity
  • definiert in einer XML-Layout-Datei (oder im Code)

Events / Programmablauf

  • werden ausgelöst, wenn etwas geschieht (z. B ein Button geklickt wird)
  • ruft eine Listener-Methode auf, sofern ein Listener definiert ist

Ein Beispiel mit mehreren Events für einen Programmablauf sieht man hier: http://www.androidpit.de/de/android/wiki/view/Datei:Beginners_Workshop_Activity_LC.png
Um Datenverlust oder den Verlust des Zustands einer Activity zu vermeiden, müssen die Daten/der Zustand der Activity gesichert werden, wenn diese pausiert (nicht mehr im Vordergrund, aber noch sichtbar) oder gestoppt (nicht mehr sichtbar) wird.

onClick()

  • Aufruf beim Drücken auf einen Button
EditText nameField = (EditText) findViewById(R.id.name_field);
String name = nameField.getText().toString();
if (name.length() == 0) {
    new AlertDialog.Builder(this) 
                   .setMessage(R.string.error_name_missing)
                   .setNeutralButton(R.string.error_ok, null)
                   .show();
    return;
} // end if

onCreate()

  • wird einmalig beim Programmstart aufgerufen
  • muss die View und die Elemente darin definieren
  • springt anschliessend weiter nach onStart()
  • definiert die Listener-Aufrufe
hiButton = (Button)findViewById(R.id.hi_button);
hiButton.setOnClickListener(this);
helloButton = (Button)findViewById(R.id.hello_button);
helloButton.setOnClickListener(this);

onDestroy()

  • Wird nur aufgerufen, wenn das Programm explizit beendet wird

onPause()

  • Geht weiter nach onResume, wenn es wieder in den Vordergrund geholt wird oder nach onStop, wenn es gar nicht mehr sichtbar ist
  • Da das Programm bei Speichermangel in diesem Zustand "abgeschossen" werden kann, müssen spätestens hier die Benutzerdaten gesichert werden

onRestart()

  • Falls das Programm gestoppt wurde, doch noch nicht wegen Speichermangels aus dem RAM entfernt wurde und nun wieder in den Vordergrund kommt, wird diese Methode aufgerufen
  • Springt anschliessend direkt nach onStart()

onResume()

  • Wird jedes Mal aufgerufen, wenn die App nach einer Pause (wieder) in den Vordergrund kommt

onStart()

  • Springt weiter nach onResume()

onStop()

  • Wird aufgerufen, wenn das Programm nicht mehr sichtbar ist
  • Je nach weiterer Folge, geht der Programmlauf weiter mit onDestroy oder onRestart.

Intent

  • startet eine andere Activity ("öffnet ein neues Fenster")
  • kann Daten an die zu startende Activity übergeben
  • kann Activities aus anderen Apps starten!

Layouts und Elemente

Wie oberhalb erwähnt, wird in /res/layout/main.xml das Layout der Hauptdatei festgelegt. Das heisst, hier werden die Elemente festgelegt.

vertikale und horizontale Layouts

Layouts können auch geschachtelt werden. Das Hauptlayout ist meist vertikal.

Vertikales Layout mit einem Titel:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
>
  <TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
  />
</LinearLayout>

Der Inhalt des Strings wird in der /res/layout/strings.xml definiert

Horizontales Layout mit zwei Knöpfen.

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
     >
    <Button 
        android:id="@+id/hi_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/hi_button" 
        />
    <Button 
        android:id="@+id/hello_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/hello_button" 
        />
</LinearLayout>

TextView (Label)

<TextView
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp"
    android:text="@string/enter_your_name"
/>

Hier müssten wir noch den String "enter_your_name" in der strings.xml definieren.

EditText (Eingabefeld)

<EditText
    android:id="@+id/name_field"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
/>

Hier bekommt das Feld eine id("name_field"), welche man später im Programm verwenden kann, um den Wert auszulesen.

Button (Knopf)

<Button 
    android:id="@+id/hi_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="@string/hi_button" 
/>

Der Knopf braucht neben der Beschriftung, welche in der strings.xml definiert wird, noch eine id, welche wieder im Programm über ein Event ausgewertet werden kann.

Programmierbeispiel komplett

Wenn man ein Android-Projekt unter Eclipse erstellt, so generiert Eclipse mehrere Dateien. Hier werden nun alphabetisch alle Dateien aufgeführt, welche im Beispielprojekt manuell angepasst wurden.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworkshop"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    
    <supports-screens 
        android:anyDensity="true"
        android:largeScreens="true" 
        android:smallScreens="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.helloworkshop.HelloWorkshopActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

HelloWorkshopActivity.java

package com.example.helloworkshop;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class HelloWorkshopActivity extends Activity implements OnClickListener {

	private Button hiButton;
	private Button helloButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        hiButton = (Button)findViewById(R.id.hi_button);
        hiButton.setOnClickListener(this);
        
        helloButton = (Button)findViewById(R.id.hello_button);
        helloButton.setOnClickListener(this);
    } // end onCreate

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.hello_workshop, menu);
        return true;
    } // end onCreateOptionsMenu

    public void onClick(View v) {
        EditText nameField = (EditText) findViewById(R.id.name_field);

        String name = nameField.getText().toString();

        if (name.length() == 0) {
            new AlertDialog.Builder(this).setMessage(
                    R.string.error_name_missing).setNeutralButton(
                    R.string.error_ok,
                    null).show();
            return;
        }

        if (v == hiButton || v == helloButton) {
            int resourceId = v == hiButton ? R.string.hi_greeting
                    : R.string.hello_greeting;

            String greeting = getResources().getString(resourceId, name);
            Toast.makeText(this, greeting, Toast.LENGTH_LONG).show();

            TextView greetingField = (TextView) findViewById(R.id.greeting_field);
            greetingField.setText(greeting);
        }
    } // end onClick
    
} // end class HelloWorkshopActivity

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

	<TextView  
    	android:id="@+id/greeting_field"
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    android:text="@string/hello"
	/>

	<TextView 
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	    android:layout_marginTop="20dp"
	    android:text="@string/enter_your_name"
    />
	
	<EditText
	    android:id="@+id/name_field"
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content" 
	>
	</EditText>
	
	<LinearLayout 
	    android:orientation="horizontal"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
     >
	    <Button 
	        android:id="@+id/hi_button"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:text="@string/hi_button" 
	    />
	    <Button 
	        android:id="@+id/hello_button"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_weight="1"
	        android:text="@string/hello_button" 
	    />
	</LinearLayout>

</LinearLayout>

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="action_settings">Settings</string>
    <string name="app_name">Hello Workshop</string>
    <string name="enter_your_name">Gib bitte Deinen Namen ein:</string>
    <string name="error_name_missing">Please enter your name.</string>
    <string name="error_ok">OK</string>
    <string name="hello">Hallo Welt Workshop!</string>
    <string name="hello_button">Say Hello!</string>
    <string name="hello_greeting">Hello %s!</string>
    <string name="hi_button">Say Hi!</string>
    <string name="hi_greeting">Hi %s!</string>
</resources>

Programm auf Gerät verschieben

Mittels Google-Konto

  1. Im Ordner bin/res befindet sich die Datei "Projektname.apk". Diese ist die notwendige Datei.
  2. Die Datei als Anhnag ans Google-Konto senden
  3. Den Anhang im Gerät anwählen und danach installieren. Will das Gerät dies nicht, kann evtl. das Programm AKPatcher verwendet werden (hat bei mir aber immer nur den Info-Screen angezeigt)
  4. Anschliessend kann die App übers App-Menü gestartet werden

Mittels USB-Verbindung

Folgende Bildergalerie verwenden: http://www.chip.de/bildergalerie/So-geht-s-APKs-via-USB-installieren-Galerie_56637615.html

  1. Einstellung: Unbekannte Quellen zulassen
  2. Verbinden im Massenspeicher Modus
  3. APK-Datei auf das Gerät in den gewünschten Ordner kopieren
  4. Mit dem Dateimanager ins obige Verzeichnis navigieren und die Datei anwählen und installieren

Links

Link Beschreibung Niveau
Java Java-Wiki Anfänger
http://www.androidpit.de/de/android/wiki/view/Android_Anf%C3%A4nger_Workshop Android-Einführungstutorial deutsch Anfänger
http://www.vogella.com/articles/Android/article.html Android-Einführungstutorial englisch Anfänger-Fortgeschrittene
http://www.makeuseof.com/tag/write-google-android-application/ Android erste Applikation von Google englisch Anfänger
http://www.kammerath.net/android-app-programmieren.html Android app programmieren deutsch Anfänger
http://www.vogella.com/articles/AndroidIntent/article.html Android Intents englisch Fortgeschrittene