Mobile App Development - Grafische Oberflächen - Mittwoch, 23. Oktober 13 Inhalt • Ressourcen • Allgemeines • Views • Layouting Mobile App Development Mittwoch, 23. Oktober 13 Ressourcen Mittwoch, 23. Oktober 13 Android Ressourcen • Ressourcen sind Dateien und Objekte, wie Layouts, Bilder, Farben und IDs • Zu jeder Ressource wird ein Eintrag in R.java generiert Mobile App Development Mittwoch, 23. Oktober 13 Android Ressourcen public final class R { public static final class color { public static final int black=0x7f040000; } public static final class drawable { public static final int ic_launcher=0x7f020000; } public static final class id { public static final int LinearLayout1=0x7f080000; public static final int btnSayHello=0x7f080004; public static final int edtName=0x7f080003; public static final int imageView1=0x7f080001; public static final int menu_settings=0x7f080005; public static final int txtEnterName=0x7f080002; } public static final class layout { public static final int activity_main=0x7f030000; public static final int test_activity=0x7f030001; } public static final class menu { public static final int activity_main=0x7f070000; } public static final class string { public static final int app_name=0x7f050000; public static final int hello_world=0x7f050001; } } Mobile App Development Mittwoch, 23. Oktober 13 Android Ressourcen • Farben res/values/colors.xml <?xml version="1.0" encoding="utf-8"?> <resources> <color name="black">#00000000</color> <color name="green">#0000FF00</color> </resources> public final class R { public static final class color { public static final int black=0x7f040000; public static final int green=0x7f040001; } } Mobile App Development Mittwoch, 23. Oktober 13 Android Ressourcen • Strings res/values/strings.xml <resources> <string name="app_name">Hello World</string> <string name="hello_world">Hello world!</string> </resources> public static final class string { public static final int app_name=0x7f050000; public static final int hello_world=0x7f050001; } Mobile App Development Mittwoch, 23. Oktober 13 Android Ressourcen • Layouts public static final class layout { public static final int ! ! ! activity_main=0x7f030000; public static final int ! ! ! test_activity=0x7f030001; } Mobile App Development Mittwoch, 23. Oktober 13 Android Ressourcen • Bilder public static final class drawable { public static final int ! ! ! ! ! ic_launcher=0x7f020000; } Mobile App Development Mittwoch, 23. Oktober 13 Android Ressourcen • IDs res/layout/activity_main.xml <LinearLayout xmlns:android="..." xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" > <TextView android:id="@+id/txtEnterName" android:text="@string/name" android:textColor="@color/black" /> <Button android:id="@+id/btnSayHello" android:text="@string/say" /> </LinearLayout> public final class R { public static final class id { public static final int LinearLayout1=0x7f080000; public static final int btnSayHello=0x7f080004; public static final int name=0x7f080002; } Mobile App Development Mittwoch, 23. Oktober 13 Android Ressourcen • Verwendung im Quelltext • Die Attribute, die in der R.java angelegt wurden, können vom Quelltext aus als Referenz-ID verwendet werden • Beispiel: Button btn = (Button) findViewById(R.id.btnSayHello); btn.setText(R.string.sayHello); btn.setBackgroundColor(R.color.green); Mobile App Development Mittwoch, 23. Oktober 13 GUIs Mittwoch, 23. Oktober 13 Grafische Oberflächen • Grafische Oberflächen können in Android auf zwei Arten erstellt werden • in Form von XML-Layout-Dateien, aus denen zur Laufzeit Views erstellt werden (LayoutInflater) • oder programmatisch wie z.B. in Swing • Wenn möglich sollten Layout-Dateien verwendet werden (res/layout) Mobile App Development Mittwoch, 23. Oktober 13 View • View (Widget) • zeichnet etwas auf dem Screen • grafisches Element, mit dem der Benutzer interagieren kann • Oberklasse von allen Standard Controls • Button, TextField, ProgressBar, ImageView Mobile App Development Mittwoch, 23. Oktober 13 ViewGroup • ViewGroup • unsichtbarer Container, der andere Views oder ViewGroups aufnimmt • ... und diese positioniert • Oberklasse von Containern • LinearLayout, GridLayout, ListView Mobile App Development Mittwoch, 23. Oktober 13 View Hierarchie • View und ViewGroups bilden eine Hierarchie, d.h. einen Baum von Views Mobile App Development Mittwoch, 23. Oktober 13 Beispiel Hello World <LinearLayout ! xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" ! ... > <ImageView android:id="@+id/imageView1" android:layout_gravity="center_horizontal" android:src="@drawable/ic_launcher" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/txtEnterName" android:text="@string/name" /> <EditText android:id="@+id/edtName" android:inputType="textCapWords" /> </LinearLayout> <Button android:id="@+id/btnSayHello" android:layout_gravity="center_horizontal" android:text="@string/say" /> </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 Views Mittwoch, 23. Oktober 13 Bu?on View • Button besteht aus einem Text und/oder einem Icon • Bei Klick wird irgendeine Aktion ausgeführt Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Button besteht aus einem Text und/oder einem Icon • Bei Klick wird irgendeine Aktion ausgeführt • XML <Button android:id="@+id/btnMyButton" android:text="@string/btnText" android:drawableLeft="@drawable/ic_launcher" /> Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • auf Klicks reagieren • Möglichkeit 1: • in der Activity einen OnClickListener erstellen und am Button registrieren • Möglichkeit 2: • Angabe einer aufzurufenden Methode während GUI Design Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 1 • programmatische Zuweisung einer OnClickListener-Implementierung Button btn = (Button) findViewById(R.id.btnSayHello); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ! ! ! /* ! ! ! * Button action code ! ! ! */ ! ! } ! }); Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 2 • Angabe einer Methode, die in der Activity ausgeführt werden soll, wenn der Button geklickt wurde • Achtung: die Methode muss in der Activity auch implementiert sein <Button android:id="@+id/btnSayHello" android:onClick="clickAction" android:text="@string/say" /> Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 2 Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 2 • Implementierung der Methode • gleicher Name, wie in XML <Button android:id="@+id/btnSayHello" android:onClick="clickAction" android:text="@string/say" /> • public-Zugriff • void return Wert • genau 1 Parameter:View public void clickAction(View view) { // do Button action } Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 2 • Implementierung der Methode • gleicher Name, wie in XML <Button android:id="@+id/btnSayHello" android:onClick="clickAction" android:text="@string/say" /> • public-Zugriff • void return Wert • genau 1 Parameter:View public void clickAction(View view) { // do Button action } Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 2 • Implementierung der Methode • gleicher Name, wie in XML <Button android:id="@+id/btnSayHello" android:onClick="clickAction" android:text="@string/say" /> • public-Zugriff • void return Wert • genau 1 Parameter:View public void clickAction(View view) { // do Button action } Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 2 • Implementierung der Methode • gleicher Name, wie in XML <Button android:id="@+id/btnSayHello" android:onClick="clickAction" android:text="@string/say" /> • public-Zugriff • void return Wert • genau 1 Parameter:View public void clickAction(View view) { // do Button action } Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 2 • Implementierung der Methode • gleicher Name, wie in XML <Button android:id="@+id/btnSayHello" android:onClick="clickAction" android:text="@string/say" /> • public-Zugriff • void return Wert • genau 1 Parameter:View public void clickAction(View view) { // do Button action } Mobile App Development Mittwoch, 23. Oktober 13 EditText View • EditText Views ermöglichen dem Benutzer die Eingabe von Text Mobile App Development Mittwoch, 23. Oktober 13 EditText View • EditText Views ermöglichen dem Benutzer die Eingabe von Text • Tastatur öffnet sich automatisch nach Touch • XML <EditText android:id="@+id/edtName" android:inputType="textCapWords" android:imeOptions="actionSend"> Mobile App Development Mittwoch, 23. Oktober 13 EditText View • Input type • gibt an, welche Art von Text eingegeben werden soll, z. B. Plain, EMail, Password • Textarten werden in Klassen eingeteilt • Variation von Textklassen • beeinflusst das Keyboard-Verhalten, z. B. erster Buchstabe groß, multi line Mobile App Development Mittwoch, 23. Oktober 13 EditText View • Input type Beispiele Klasse Text Variation CapSentence Mobile App Development Mittwoch, 23. Oktober 13 Number Text Decimal Password EditText View • Input type setzen Mobile App Development Mittwoch, 23. Oktober 13 EditText View • Input type setzen • XML <EditText ! android:id="@+id/edtName" ! android:inputType="textCapWords|textNoSuggestions" /> • programmatisch EditText edtName = (EditText) findViewById(R.id.edtName); edtName.setInputType(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS ! ! | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); Mobile App Development Mittwoch, 23. Oktober 13 EditText View • Keyboard action • gibt an, welcher Button an Stelle des Return-Buttons in der Tastatur angezeigt werden soll • XML <EditText android:id="@+id/myEditText" android:imeOptions="actionNone" android:singleLine="true" /> Mobile App Development Mittwoch, 23. Oktober 13 EditText View actionNext Mobile App Development Mittwoch, 23. Oktober 13 actionDone actionSend EditText View actionNone Mobile App Development Mittwoch, 23. Oktober 13 actionGo actionSearch EditText View • Auf Keyboard action reagieren EditText txt = (EditText) findViewById(R.id.EditText01); txt.setOnEditorActionListener(new TextView.OnEditorActionListener() { ! ! @Override ! ! public boolean onEditorAction( TextView v, int actionId, KeyEvent event) { ! ! ! boolean handled = false; ! ! ! ! ! ! ! ! }); ! } return handled; Mobile App Development Mittwoch, 23. Oktober 13 EditText View • Weitere Eigenschaften • Hint text <EditText ... android:hint="Hint Text"> • Lines <EditText ... android:lines="3"> • Bilder <EditText ... android:drawableLeft ! ! ="@drawable/ic_launcher"> Mobile App Development Mittwoch, 23. Oktober 13 EditText View • ... und noch mehr Eigenschaften • Text style, typeface, size • Line spacing • Text color, hint color • ... Mobile App Development Mittwoch, 23. Oktober 13 CheckBox View • Eine CheckBox ermöglicht dem Benutzer eine mit ihr verknüpfte Eigenschaft auf true oder false zu setzen. Mobile App Development Mittwoch, 23. Oktober 13 CheckBox View • Eine CheckBox ermöglicht dem Benutzer eine mit ihr verknüpfte Eigenschaft auf true oder false zu setzen. • XML <CheckBox android:id="@+id/chbBeer" android:layout_width="match_parent" android:layout_height="wrap_content" android:checked="true" android:text="@string/beer" /> Mobile App Development Mittwoch, 23. Oktober 13 CheckBox View • auf CheckBox Klicks reagieren • Möglichkeit 1 • Angabe einer Methode die in der Activity ausgeführt werden soll, wenn der Button geklickt wurde • Möglichkeit 2 • programmatische Zuweisung eines OnClickListeners Mobile App Development Mittwoch, 23. Oktober 13 CheckBox View • Möglichkeit 1 • Angabe einer Methode, die in der Activity ausgeführt werden soll, wenn die CheckBox geklickt wurde <CheckBox android:id="@+id/checkBox1" android:checked="true" android:onClick="onBeerBoxClicked" android:text="@string/beer" /> Mobile App Development Mittwoch, 23. Oktober 13 CheckBox View • Möglichkeit 1 Mobile App Development Mittwoch, 23. Oktober 13 Bu?on View • Möglichkeit 1 • Implementierung der Methode • gleicher Name, wie in XML • public-Zugriff • void return Wert • genau ein Parameter:View Mobile App Development Mittwoch, 23. Oktober 13 <CheckBox android:id="@+id/checkBox1" android:checked="true" android:onClick="onBeerBoxClicked" android:text="@string/beer" /> public void onBeerBoxClicked(View view) { ! CheckBox cb = (CheckBox) ! ! findViewById(R.id.checkBox1); ! if (cb.isSelected()) { ! ! /* do something */ ! } else { ! ! /* do the other things */ ! } } Bu?on View • Möglichkeit 1 • Implementierung der Methode • gleicher Name, wie in XML • public-Zugriff • void return Wert • genau ein Parameter:View Mobile App Development Mittwoch, 23. Oktober 13 <CheckBox android:id="@+id/checkBox1" android:checked="true" android:onClick="onBeerBoxClicked" android:text="@string/beer" /> public void onBeerBoxClicked(View view) { ! CheckBox cb = (CheckBox) ! ! findViewById(R.id.checkBox1); ! if (cb.isSelected()) { ! ! /* do something */ ! } else { ! ! /* do the other things */ ! } } Bu?on View • Möglichkeit 1 • Implementierung der Methode • gleicher Name, wie in XML • public-Zugriff • void return Wert • genau ein Parameter:View Mobile App Development Mittwoch, 23. Oktober 13 <CheckBox android:id="@+id/checkBox1" android:checked="true" android:onClick="onBeerBoxClicked" android:text="@string/beer" /> public void onBeerBoxClicked(View view) { ! CheckBox cb = (CheckBox) ! ! findViewById(R.id.checkBox1); ! if (cb.isSelected()) { ! ! /* do something */ ! } else { ! ! /* do the other things */ ! } } Bu?on View • Möglichkeit 1 • Implementierung der Methode • gleicher Name, wie in XML • public-Zugriff • void return Wert • genau ein Parameter:View Mobile App Development Mittwoch, 23. Oktober 13 <CheckBox android:id="@+id/checkBox1" android:checked="true" android:onClick="onBeerBoxClicked" android:text="@string/beer" /> public void onBeerBoxClicked(View view) { ! CheckBox cb = (CheckBox) ! ! findViewById(R.id.checkBox1); ! if (cb.isSelected()) { ! ! /* do something */ ! } else { ! ! /* do the other things */ ! } } Bu?on View • Möglichkeit 1 • Implementierung der Methode • gleicher Name, wie in XML • public-Zugriff • void return Wert • genau ein Parameter:View Mobile App Development Mittwoch, 23. Oktober 13 <CheckBox android:id="@+id/checkBox1" android:checked="true" android:onClick="onBeerBoxClicked" android:text="@string/beer" /> public void onBeerBoxClicked(View view) { ! CheckBox cb = (CheckBox) ! ! findViewById(R.id.checkBox1); ! if (cb.isSelected()) { ! ! /* do something */ ! } else { ! ! /* do the other things */ ! } } CheckBox View • Möglichkeit 2 • programmatische Zuweisung eines OnClickListeners CheckBox cbBeer = (CheckBox) findViewById(R.id.cbBeer); cbBeer.setOnClickListener(new View.OnClickListener() { ! ! @Override ! ! public void onClick(View v) { ! ! ! CheckBox cb = (CheckBox) v; ! ! ! if (cb.isChecked()) { ! ! ! ! /* do something */ ! ! ! ! Toast.makeText(MainActivity.this, ! ! ! ! ! ! "Beer clicked", Toast.LENGTH_LONG).show(); ! ! ! } else { ! ! ! ! /* do the other things */ ! ! ! } ! ! } ! }); Mobile App Development Mittwoch, 23. Oktober 13 CheckBox View • Möglichkeit 2 • Alternative: programmatische Zuweisung eines OnCheckedChangeListener cbBeer.setOnCheckedChangeListener(new OnCheckedChangeListener() { ! @Override ! public void onCheckedChanged( ! ! CompoundButton buttonView, boolean isChecked) { ! ! ! /* do your stuff */ ! ! } }); Mobile App Development Mittwoch, 23. Oktober 13 RadioBu?on View • RadioButtons ermöglichen dem Benutzer die Auswahl einer Option aus mehreren verschiedenen. Mobile App Development Mittwoch, 23. Oktober 13 RadioBu?on View • Optionen, die durch RadioButton repräsentiert werden, schließen sich gegenseitig aus (mutually exclusiv) • RadioButtons werden in RadioGroups zusammengefasst Mobile App Development Mittwoch, 23. Oktober 13 RadioBu?on View • XML <RadioGroup android:id="@+id/radioGroup1" android:orientation="vertical" > <RadioButton android:id="@+id/radio0" android:checked="true" android:text="@string/mada"/> <RadioButton android:id="@+id/radio1" android:text="@string/ikonzepte" /> <RadioButton android:id="@+id/radio2" android:text="@string/prakSchalt" /> </RadioGroup> Mobile App Development Mittwoch, 23. Oktober 13 RadioBu?on View <RadioGroup android:id="@+id/radioGroup1" android:orientation="vertical" > • auf Auswahl <RadioButton android:id="@+id/radio0" android:checked="true" android:text="@string/mada" android:onClick="onSelect"/> • Angabe der <RadioButton android:id="@+id/radio1" android:text="@string/ikonzepte" android:onClick="onSelect" /> reagieren Activity-Methode <RadioButton android:id="@+id/radio2" android:text="@string/prakSchalt" android:onClick="onSelect"/> </RadioGroup> Mobile App Development Mittwoch, 23. Oktober 13 RadioBu?on View • Implementierung in Activity • Regeln für Signatur analog zu Button und CheckBox public void onSelect(View view) { ! switch (view.getId()) { ! ! case R.id.radio0: ! ! ! /* MADA selected */ ! ! ! break; ! ! case R.id.radio1: ! ! ! /* IKZ selected */ ! ! ! break; ! ! case R.id.radio2: ! ! ! /* prakt. Schalt. selected */ ! ! ! break; ! } } Mobile App Development Mittwoch, 23. Oktober 13 ProgressBar View • ProgressBars werden verwendet, um den Fortschritt einer Operation anzuzeigen Mobile App Development Mittwoch, 23. Oktober 13 ProgressBar View • ProgressBars werden verwendet, um den Fortschritt einer Operation anzuzeigen <ProgressBar android:id="@+id/progressBar1" style= ! "@android:style/Widget.ProgressBar.Horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="100" android:progress="70" /> Mobile App Development Mittwoch, 23. Oktober 13 ProgressBar View • style Attribute bestimmt die Form der ProgressBar <ProgressBar android:id="@+id/progressBar1" style= ! "@android:style/Widget.ProgressBar.Horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="100" android:progress="70" /> Mobile App Development Mittwoch, 23. Oktober 13 ProgressBar View • max = Anzahl Ticks • progress = aktuelle Ticks <ProgressBar android:id="@+id/progressBar1" style= ! "@android:style/Widget.ProgressBar.Horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:indeterminate="false" android:max="100" android:progress="70" /> Mobile App Development Mittwoch, 23. Oktober 13 ProgressBar View • Spezielle ProgressBars • RatingBar • Verwendung zur Dar- stellung einer Bewertung • SeekBar • Verwendung zum Setzen eines Wertes (z. B. Lautstärke) Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Eine Spinner View erlaubt dem Benutzer die Auswahl eines einzelnen Elements aus einer Menge. Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Eine Spinner View erlaubt dem Benutzer die Auswahl eines einzelnen Elements aus einer Menge. • XML <Spinner android:id="@+id/mySpinner" android:layout_width="fill_parent" android:layout_height="wrap_content" ... /> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Wo kommen die Superhelden her und wie wird der Spinner gefüllt? Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Wo kommen die Superhelden her und wie wird der Spinner gefüllt? • 1. Situation: Elemente sind zur Compile-Zeit bekannt • 2. Situation: Elemente sind zur Compile-Zeit noch nicht bekannt Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Sind die Elemente zur Compile-Zeit bekannt, können sie in einer ArrayResource eingetragen und verwendet werden. • Was sind Array-Resourcen? Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Definition eines String arrays • res/values/strings.xml <resources> <string name="app_name">Test</string> <string name="hello_world">Hello world!</string> ... ... <string-array name="spinner_values"> <item >Superman</item> <item >Batman</item> <item >Spiderman</item> <item >Flash</item> </string-array> </resources> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Zuweisung des String arrays an den Spinner res/values/strings.xml <resources> ... <string-array name="spinner_values"> <item >Superman</item> <item >Batman</item> <item >Spiderman</item> <item >Flash</item> </string-array> </resources> res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="..." ! ... ! <Spinner ! ! android:id="@+id/mySpinner" ! ! android:entries="@array/spinner_values"/> ! ... </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Zuweisung des String arrays an den Spinner res/values/strings.xml <resources> ... <string-array name="spinner_values"> <item >Superman</item> <item >Batman</item> <item >Spiderman</item> <item >Flash</item> </string-array> </resources> res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="..." ! ... ! <Spinner ! ! android:id="@+id/mySpinner" ! ! android:entries="@array/spinner_values"/> ! ... </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Zuweisung des String arrays an den Spinner res/values/strings.xml <resources> ... <string-array name="spinner_values"> <item >Superman</item> <item >Batman</item> <item >Spiderman</item> <item >Flash</item> </string-array> </resources> res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="..." ! ... ! <Spinner ! ! android:id="@+id/mySpinner" ! ! android:entries="@array/spinner_values"/> ! ... </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • 2. Situation: Elemente erst zur Laufzeit bekannt • Verwendung von Adaptern • Adapter bilden Brücke zwischen sog. AdapterViews und den darzustellenden Daten Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Verwendung eines ArrayAdapters /* Erstellung eines Adapters */ ArrayAdapter<String> adapter = new ArrayAdapter<String>( ! ! ! ! this, android.R.layout.simple_spinner_item); /* Datenelemente hinzufügen */ adapter.add("Superman"); adapter.add("Batman"); adapter.add("Spiderman"); adapter.add("Flash"); /* Spinner Instanz holen */ Spinner s = (Spinner) findViewById(R.id.mySpinner); /* Adapter für den Spinner festlegen */ s.setAdapter(adapter); Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Auf eine Auswahl reagieren Spinner spinner = ! (Spinner) findViewById(R.id.mySpinner); spinner.setOnItemSelectedListener( ! new AdapterView.OnItemSelectedListener() { ! ! ! ! ! ! ! ! @Override public void onItemSelected( ! ! AdapterView<?> parent, ! ! View view, int pos, long id) { ! // TODO: implement me ! String str = (String) ! ! ! ! ! parent.getItemAtPosition(pos); } ! @Override ! public void onNothingSelected( ! ! ! AdapterView<?> parent) { ! ! // TODO: implement me ! }! }); Mobile App Development Mittwoch, 23. Oktober 13 List View • ListViews werden verwendet, um mehrere Elemente in einer vertikalen Liste darzustellen Mobile App Development Mittwoch, 23. Oktober 13 List View • ListViews werden verwendet, um mehrere Elemente in einer vertikalen Liste darzustellen • XML <ListView android:id="@+id/listView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:entries="@array/list_values" > Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Wie wird die Liste befüllt? analog zur SpinnerView • 1. Situation: Elemente sind zur Compile-Zeit bekannt • 2. Situation: Elemente sind zur Compile-Zeit noch nicht bekannt Mobile App Development Mittwoch, 23. Oktober 13 List View • Definition eines String arrays • res/values/strings.xml <resources> <string name="app_name">Test</string> <string name="hello_world">Hello world!</string> ... ... <string-array name="list_values"> <item >Brot</item> <item >Schinken</item> <item >Käse</item> <item >Butter</item> <item >Bier</item> </string-array> </resources> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Zuweisung des String arrays an die Liste res/layout/activity_main.xml res/values/strings.xml <resources> ... <string-array name="list_values"> <item >Brot</item> <item >Schinken</item> <item >Käse</item> <item >Butter</item> <item >Bier</item> </string-array> </resources> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="..." ! ... ! <ListView ! ! android:id="@+id/myList" ! ! android:entries="@array/list_values"/> ! ... </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Zuweisung des String arrays an die Liste res/layout/activity_main.xml res/values/strings.xml <resources> ... <string-array name="list_values"> <item >Brot</item> <item >Schinken</item> <item >Käse</item> <item >Butter</item> <item >Bier</item> </string-array> </resources> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="..." ! ... ! <ListView ! ! android:id="@+id/myList" ! ! android:entries="@array/list_values"/> ! ... </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Zuweisung des String arrays an die Liste res/layout/activity_main.xml res/values/strings.xml <resources> ... <string-array name="list_values"> <item >Brot</item> <item >Schinken</item> <item >Käse</item> <item >Butter</item> <item >Bier</item> </string-array> </resources> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="..." ! ... ! <ListView ! ! android:id="@+id/myList" ! ! android:entries="@array/list_values"/> ! ... </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • 2. Situation: Elemente erst zur Laufzeit bekannt • Verwendung eines Adapters, um die Liste zur Laufzeit zu befüllen Mobile App Development Mittwoch, 23. Oktober 13 Spinner View • Verwendung eines Adapters, um die Liste zur Laufzeit zu befüllen ArrayAdapter<String> adapter = ! ! ! new ArrayAdapter<String>(this, ! ! ! ! ! android.R.layout.simple_list_item_1); adapter.add("Brot"); adapter.add("Schinken"); adapter.add("Käse"); ! ! ListView lv = (ListView) findViewById(R.id.listView1); lv.setAdapter(adapter); Mobile App Development Mittwoch, 23. Oktober 13 List View • Auf Element Klicks reagieren ListView lv = (ListView) findViewById( ! ! R.id.myListView); ! ! lv.setOnItemClickListener( ! new AdapterView.OnItemClickListener() { ! ! @Override ! ! public void onItemClick( ! ! ! AdapterView<?> list, ! ! ! View view, int pos, long id) { ! ! ! ! /* do your stuff here */ ! ! } }); Mobile App Development Mittwoch, 23. Oktober 13 LayouJng Mittwoch, 23. Oktober 13 Layouts • Layouts ... • sind ViewGroups (Container) • können andere ViewGroups und Views aufnehmen • werden verwendet, um ihre Kindelemente auf dem Screen zu positionieren Mobile App Development Mittwoch, 23. Oktober 13 Layout Parameter • Jede View besitzt Layout-Parameter, die der umgebenden ViewGroup mitteilen, wie die View in Position und Größe dargestellt werden soll. • Je nach umgebender View werden verschiedene Layout-Parameter verwendet. Mobile App Development Mittwoch, 23. Oktober 13 Layout Parameter • Beispiel <Button ! android:id="@+id/myButton" ! android:layout_width="wrap_content" ! android:layout_height="wrap_content" ! android:text="Button" /> <Button ! android:id="@+id/myButton" ! android:layout_width="wrap_content" ! android:layout_height="fill_parent" ! android:text="Button" /> <Button ! android:id="@+id/myButton" ! android:layout_width="fill_parent" ! android:layout_height="fill_parent" ! android:text="Button" /> Mobile App Development Mittwoch, 23. Oktober 13 FrameLayout • wird in der Regel verwendet, um ein Element darzustellen • Layout-Attribut gravity <FrameLayout xmlns:android= ! ! "http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/myButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/mybutton" /> </FrameLayout> Mobile App Development Mittwoch, 23. Oktober 13 FrameLayout auch mehrere, gestapelte Views • kann enthalten • Darstellung nach Einfügereihenfolge <FrameLayout xmlns:android= ! ! "http://schemas.android.com/apk/res/android" ! android:layout_width="fill_parent" ! android:layout_height="fill_parent" > ! <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/lorem" /> <Button android:id="@+id/myButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Button" /> </FrameLayout> Mobile App Development Mittwoch, 23. Oktober 13 LinearLayout • Ein LinearLayout richtet seine Kindelemente entlang einer bestimmt Richtung aus • Diese Richtung (Orientierung) kann horizontal und vertikal sein Mobile App Development Mittwoch, 23. Oktober 13 LinearLayout • Orientierung <LinearLayout xmlns:android="..." android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:text="@string/enter"/> <EditText android:id="@+id/editText1" android:layout_width="0dip" android:layout_height="wrap_content"/ > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/mybutton" /> </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 LinearLayout • Orientierung <LinearLayout xmlns:android="..." android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:text="@string/enter"/> <EditText android:id="@+id/editText1" android:layout_width="0dip" android:layout_height="wrap_content"/ > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/mybutton" /> </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 LinearLayout • Orientierung <LinearLayout xmlns:android="..." android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:text="@string/enter"/> <EditText android:id="@+id/editText1" android:layout_width="0dip" android:layout_height="wrap_content"/ > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/mybutton" /> </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 LinearLayout • Layout-Parameter weight • gibt an, wie groß eine View im Verhältnis zu anderen Views dargestellt werden soll • nicht ausgefüllter Platz im parent wird zwischen den Views gemäß dem Verhältnis ihrer weight Werte verteilt <EditText android:id="@+id/myEditText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="2" > Mobile App Development Mittwoch, 23. Oktober 13 LinearLayout • Beispiel Layout-Parameter weight weight weight weight TextField - - 1 EditText - 1 2 Button - - 3 Mobile App Development Mittwoch, 23. Oktober 13 TableLayout • Das TableLayout richtet seine Kindelemente in Form einer Tabelle aus, d. h. in Form von Spalten und Zeilen • Aufbau des Layouts ist sehr ähnlich zu HTML-Tabellen (<tr>, <td>) • Kindelemente werden in Zeilen und Zellen gruppiert Mobile App Development Mittwoch, 23. Oktober 13 TableLayout • Beispiel ! <TableLayout android:stretchColumns="*" > <TableRow android:id="@+id/tableRow1" > <TextView android:id="@+id/textView1" android:text="Text1" /> <TextView android:id="@+id/textView2" android:text="Text2" /> </TableRow> <TableRow android:id="@+id/tableRow2"> <Button android:id="@+id/button1" android:text="Button1" /> <Button android:id="@+id/button2" android:text="Button2" /> </TableRow> </TableLayout> Mobile App Development Mittwoch, 23. Oktober 13 TableLayout • Shrink-Attribut • gibt an, welche Spalten verkleinert werden sollen, wenn der Platz nicht für alle reicht • mögliche Werte: • Liste von Spaltenindizes • * für alle Spalten Mobile App Development Mittwoch, 23. Oktober 13 TableLayout • Shrink-Attribut <TableLayout ... android:shrinkColumns="*"> ! ! <TableRow android:id="@+id/tableRow1"> ! ... </TableRow> .... Mobile App Development Mittwoch, 23. Oktober 13 TableLayout • Stretch-Attribut • gibt an, welche Spalten vergrößert werden sollen, wenn mehr Platz als benötigt zur Verfügung steht • mögliche Werte: • Liste von Spaltenindizes • * für alle Spalten Mobile App Development Mittwoch, 23. Oktober 13 TableLayout • Stretch-Attribut <TableLayout ... android:stretchColumns="0" android:stretchColumns="1,2" android:stretchColumns="*" > <TableRow ...> ... </TableRow> </TableLayout> Mobile App Development Mittwoch, 23. Oktober 13 RelaJveLayout • RelativeLayout wird verwendet, um Views relativ zu einander auszurichten • Nachteil: kompliziertes Layout • Vorteil: sehr flache View-Hierarchie und dadurch bessere Performance Mobile App Development Mittwoch, 23. Oktober 13 RelaJveLayout <RelativeLayout xmlns:android="..." android:id="@+id/RelativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/textView1" android:layout_alignParentLeft="true" android:layout_alignParentTop="true"/> <EditText android:id="@+id/editText1" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1"/ > <Button android:id="@+id/button1" android:layout_alignRight="@+id/editText1" android:layout_below="@+id/editText1" android:text="@string/mybutton" /> </RelativeLayout> Mobile App Development Mittwoch, 23. Oktober 13 RelaJveLayout • RelativeLayout.LayoutParams http://developer.android.com/reference/android/widget/ RelativeLayout.LayoutParams.html Mobile App Development Mittwoch, 23. Oktober 13 RelaJveLayout • RelativeLayout.LayoutParams http://developer.android.com/reference/android/widget/ RelativeLayout.LayoutParams.html Mobile App Development Mittwoch, 23. Oktober 13 <include/> • Wiederverwendung von Layouts • Oft ist es sinnvoll bestimmte Layouts wieder zu verwenden, um Mehrarbeit zu vermeiden • Hierfür bietet Android das <include/> Element Mobile App Development Mittwoch, 23. Oktober 13 <include/> • Beispiel <?xml version="1.0" encoding="utf-8"?> <LinearLayout ... android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:orientation="horizontal" > <Button android:id="@+id/btnOk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@android:string/ok" /> <Button android:id="@+id/btnCancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@android:string/cancel" /> </LinearLayout> Mobile App Development Mittwoch, 23. Oktober 13 <include/> • Beispiel <RelativeLayout ... > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/name"/> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/textView1"/> <include android:id="@+id/include1" android:layout_width="match_parent" android:layout_height="wrap_content" layout="@layout/ok_cancel" /> </RelativeLayout> Mobile App Development Mittwoch, 23. Oktober 13 PrakJkum Mittwoch, 23. Oktober 13 Übung Übung 01 - Taschenrechner Es soll eine Taschenrechner-App erstellt werden, mit der einfache Berechnungen durchgeführt werden können. Die App soll mindestens die Grundrechenarten Addition, Subtraktion, Multiplikation und Division unterstützen. Außerdem soll es möglich sein, mehr als zwei Operanden und mehr als einen Operator einzugeben, sowie das Ergebnis der Berechnung als Operand für die nächste Berechnung zu verwenden. Für die Entwicklung der App sollen die in der Vorlesung vorgestellten Viewund ViewGroup-Elemente verwendet werden. Hinweis: Der Fokus dieser Übung liegt nicht auf der Auswertung mathematischer Ausdrücke, sondern auf der Entwicklung einer funktionsfähigen Oberfläche. Aus diesem Grund kann für die Auswertung und Berechnung der Ausdrücke eine externe Bibliothek, wie bspw. http://www.objecthunter.net/exp4j verwendet werden. Die Abgabe der Übung findet nach der nächsten Veranstaltung statt. Die Übungen werden werden in Gruppen von mindestens zwei Studierenden durchgeführt. Mobile App Development Mittwoch, 23. Oktober 13 Literatur I. Sven Haiges: Android Schnelleinstieg entwickler.press, 2011 II. Thomas Künneth: Android 3 - Apps entwickeln mit dem Android SDK Galileo Press, 2011 III. http://developer.android.com IV. http://www.androidpit.de/de/android/wiki Mittwoch, 23. Oktober 13