Mobile App Development - Grafische Oberflächen - Inhalt • Ressourcen • Allgemeines • Views • Layouting Mobile App Development ChristophKarls Ressourcen AndroidRessourcen Mobile App Development ChristophKarls AndroidRessourcen • Ressourcen sind Dateien und Objekte, wie Layouts, Bilder, Farben und IDs • Zu jeder Ressource wird ein Eintrag in R.java generiert Mobile App Development ChristophKarls AndroidRessourcen 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 ChristophKarls AndroidRessourcen • 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 ChristophKarls AndroidRessourcen • 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 ChristophKarls AndroidRessourcen • Layouts public static final class layout { public static final int activity_main=0x7f030000; public static final int content_main=0x7f030001; } Mobile App Development ChristophKarls AndroidRessourcen • Bilder public static final class drawable { public static final int ic_launcher=0x7f020000; } Mobile App Development ChristophKarls AndroidRessourcen • 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 ChristophKarls AndroidRessourcen • 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.button); btn.setText(R.string.app_name); Mobile App Development ChristophKarls GUIs GrafischeOberflä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 ChristophKarls 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 ChristophKarls ViewGroup • ViewGroup • unsichtbarer Container, der andere Views oder ViewGroups aufnimmt • ... und diese positioniert • Oberklasse von Containern • LinearLayout, GridLayout, ListView Mobile App Development ChristophKarls ViewHierarchie • View und ViewGroups bilden eine Hierarchie, d.h. einen Baum von Views Mobile App Development ChristophKarls BeispielHelloWorld <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Example Application 1" android:id="@+id/tvHeadline" /> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"> . . . <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/etName" android:layout_weight="1" /> </LinearLayout> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Say Hello?" android:id="@+id/btnSayHello" /> </LinearLayout> Mobile App Development ChristophKarls Views BuAonView • Button besteht aus einem Text und/oder einem Icon • Bei Klick wird irgendeine Aktion ausgeführt Mobile App Development ChristophKarls BuAonView • 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 ChristophKarls BuAonView • 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 ChristophKarls BuAonView • Möglichkeit 1 • programmatische Zuweisung einer OnClickListener-Implementierung button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { /* IMPLEMENT ACTION */ } }); Mobile App Development ChristophKarls BuAonView • 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:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Say Hallo" android:id="@+id/button" android:onClick="btnClick" /> Mobile App Development ChristophKarls BuAonView • Möglichkeit 2 Mobile App Development ChristophKarls BuAonView • Möglichkeit 2 • Implementierung der Methode • gleicher Name, wie in XML <Button android:text="Say Hallo" android:id="@+id/button" android:onClick="btnClick" /> • public-Zugriff • void return Wert • genau 1 Parameter:View public void btnClick(View view) { // do magic ... } Mobile App Development ChristophKarls EditTextView • EditText Views ermöglichen dem Benutzer die Eingabe von Text Mobile App Development ChristophKarls EditTextView • EditText Views ermöglichen dem Benutzer die Eingabe von Text • Tastatur öffnet sich automatisch nach Touch • XML <EditText android:inputType="textPersonName" android:text="Name" android:id=„@+id/editText" /> Mobile App Development ChristophKarls EditTextView • Input type • gibt an, welche Art von Text eingegeben werden soll, z. B. Plain, E-Mail, Password • Textarten werden in Klassen eingeteilt • Variation von Textklassen • beeinflusst das Keyboard-Verhalten, z. B. erster Buchstabe groß, multi line Mobile App Development ChristophKarls EditTextView • InputType Beispiele Klasse Variation Text Number Text textCapSentences numberDecimal textPassword Mobile App Development ChristophKarls EditTextView • Input type setzen Mobile App Development ChristophKarls EditTextView • Input type setzen • XML <EditText android:inputType="textCapWords|textAutoComplete" android:text="Name" android:id=„@+id/editText" /> • programmatisch editText = (EditText) findViewById(R.id.editText); editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); Mobile App Development ChristophKarls EditTextView • 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 ChristophKarls EditTextView actionNone Mobile App Development actionDone ChristophKarls actionSend EditTextView actionNext Mobile App Development actionGo ChristophKarls actionSearch EditTextView • Auf Keyboard action reagieren editText.setOnEditorActionListener(new EditText.OnEditorActionListener() { @Override public boolean onEditorAction( TextView v, int actionId, KeyEvent event) { boolean handled = false; } return handled; }); Mobile App Development ChristophKarls EditTextView • Weitere Eigenschaften • Hint text ... <EditText android:hint="Guess your Name ...“ /> • Bilder <EditText ... android:text="" android:hint="Guess your Name ..." android:drawableRight=„@mipmap/ic_launcher" /> Mobile App Development ChristophKarls EditTextView • ... und noch mehr Eigenschaften • Text style, typeface, size • Line spacing • Text color, hint color • ... Mobile App Development ChristophKarls CheckBoxView • Eine CheckBox ermöglicht dem Benutzer eine mit ihr verknüpfte Eigenschaft auf true oder false zu setzen. Mobile App Development ChristophKarls CheckBoxView • Eine CheckBox ermöglicht dem Benutzer eine mit ihr verknüpfte Eigenschaft auf true oder false zu setzen. • XML <CheckBox android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Beer" android:id="@+id/chkBeer" android:checked="true" /> Mobile App Development ChristophKarls CheckBoxView • 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 ChristophKarls CheckBoxView • Möglichkeit 1 • Angabe einer Methode, die in der Activity ausgeführt werden soll, wenn die CheckBox geklickt wurde <CheckBox android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Beer" android:id="@+id/chkBeer" android:onClick="onBeerBoxClicked" android:checked="true" /> Mobile App Development ChristophKarls CheckBoxView • Möglichkeit 1 Mobile App Development ChristophKarls BuAonView • Möglichkeit 1 • Implementierung der Methode • gleicher Name, <CheckBox android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Beer" android:id="@+id/chkBeer" android:onClick="onBeerBoxClicked" android:checked="true" /> wie in XML • public-Zugriff • void return Wert • genau ein Parameter:View Mobile App Development public void onBeerBoxClicked(View view) { CheckBox cb = (CheckBox) findViewById(R.id.chkBeer); if (cb.isSelected()) { /* do something */ } else { /* do it not ... */ } } ChristophKarls CheckBoxView • 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 ChristophKarls CheckBoxView • Möglichkeit 2 • Alternative: programmatische Zuweisung eines OnCheckedChangeListener CheckBox cb = (CheckBox) findViewById(R.id.chkBeer); cb.setOnCheckedChangeListener (new CompoundButton.OnCheckedChangeListener() { }); @Override public void onCheckedChanged( CompoundButton buttonView, boolean isChecked) { /* state = !state */ } Mobile App Development ChristophKarls RadioBuAonView • RadioButtons ermöglichen dem Benutzer die Auswahl einer Option aus mehreren verschiedenen. Mobile App Development ChristophKarls RadioBuAonView • Optionen, die durch RadioButton repräsentiert werden, schließen sich gegenseitig aus (mutually exclusiv) • RadioButtons werden in RadioGroups zusammengefasst Mobile App Development ChristophKarls RadioBuAonView • XML <RadioGroup android:id="@+id/radioGroupWpf" android:layout_width="fill_parent" android:layout_height="wrap_content"> <RadioButton android:text="@string/recht" android:id="@+id/rbRecht"/> <RadioButton android:text="@string/compilerbau" android:id="@+id/rbCompiler"/> <RadioButton android:text="@string/prozessor" android:id="@+id/rbProzessor"/> <RadioButton android:text="@string/mada" android:id="@+id/rbMada" android:checked="true" /> </RadioGroup> Mobile App Development ChristophKarls RadioBuAonView <RadioGroup android:id="@+id/radioGroupWpf" android:layout_width="fill_parent" android:layout_height="wrap_content"> • • auf Auswahl reagieren <RadioButton android:text="@string/recht" android:id="@+id/rbRecht" android:onClick="rbSelect"/> Angabe der Activity-Methode <RadioButton android:text="@string/compilerbau" android:id="@+id/rbCompiler" android:onClick=„rbSelect" /> <RadioButton android:text="@string/prozessor" android:id="@+id/rbProzessor" android:onClick="rbSelect"/> <RadioButton android:text="@string/mada" android:id="@+id/rbMada" android:onClick="rbSelect" android:checked="true" /> </RadioGroup> Mobile App Development ChristophKarls RadioBuAonView • Implementierung in Activity • Regeln für Signatur analog zu Button und CheckBox Mobile App Development public void onSelect(View view) { switch (view.getId()) { case R.id.rbCompiler: /* do */ break; case R.id.rbMada: /* some */ break; case R.id.rbProzessor: /* nice */ break; case R.id.rbRecht: /* things ... */ break; default: /* WTF ?? */ break; } } ChristophKarls ProgressBarView • ProgressBars werden verwendet, um den Fortschritt einer Operation anzuzeigen Mobile App Development ChristophKarls ProgressBarView • ProgressBars werden verwendet, um den Fortschritt einer Operation anzuzeigen <ProgressBar ... android:id="@+id/pBar" android:progress="70" android:max="100" /> Mobile App Development ChristophKarls ProgressBarView • style Attribute bestimmt die Form der ProgressBar <ProgressBar ... style=„?android:attr/progressBarStyleHorizontal" android:id="@+id/pBarh" android:progress="70" android:max="100"/> Mobile App Development ChristophKarls ProgressBarView • max = Anzahl Ticks • progress = aktuelle Ticks <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/pBarh" android:layout_gravity="center_horizontal" android:progress="70" android:max="100"/> Mobile App Development ChristophKarls ProgressBarView • Spezielle ProgressBars • RatingBar • Verwendung zur Dar- stellung einer Bewertung • SeekBar • Verwendung zum Setzen eines Wertes (z. B. Lautstärke) Mobile App Development ChristophKarls SpinnerView • Eine Spinner View erlaubt dem Benutzer die Auswahl eines einzelnen Elements aus einer Menge. Mobile App Development ChristophKarls SpinnerView • Eine Spinner View erlaubt dem Benutzer die Auswahl eines einzelnen Elements aus einer Menge. • XML <Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" ... /> Mobile App Development ChristophKarls SpinnerView • Wo kommen die Superhelden her und wie wird der Spinner gefüllt? Mobile App Development ChristophKarls SpinnerView • 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 ChristophKarls SpinnerView • Sind die Elemente zur Compile-Zeit bekannt, können sie in einer ArrayResource eingetragen und verwendet werden. • Was sind Array-Resourcen? Mobile App Development ChristophKarls SpinnerView • Definition eines String arrays • res/values/strings.xml <resources> ... <string-array name="heros"> <item>Superman</item> <item>Batman</item> <item>Spiderman</item> <item>Flash</item> </string-array> </resources> Mobile App Development ChristophKarls SpinnerView • Zuweisung des String arrays an den Spinner res/values/strings.xml <resources> ... <string-array name="heros"> <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="http://schemas.android.com/apk/res/ android" xmlns:tools="http://schemas.android.com/tools" ... <Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/heros" /> </LinearLayout> Mobile App Development ChristophKarls SpinnerView • 2. Situation: Elemente erst zur Laufzeit bekannt • Verwendung von Adaptern • Adapter bilden Brücke zwischen sog. AdapterViews und den darzustellenden Daten Mobile App Development ChristophKarls SpinnerView • Verwendung eines ArrayAdapters /* ArrayAdapter erstellen */ ArrayAdapter<String> adapter = new ArrayAdapter<String>( MainActivity.this, R.layout.support_simple_spinner_dropdown_item); /* Daten hinzufügen */ adapter.add("Superman"); adapter.add("Batman"); adapter.add("Spiderman"); adapter.add("Flash"); /*Spinner aus View organisieren und Adapter zuweisen */ Spinner s = (Spinner) findViewById(R.id.spinner); s.setAdapter(adapter); Mobile App Development ChristophKarls SpinnerView • Auf eine Auswahl reagieren s.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 ChristophKarls ListView • ListViews werden verwendet, um mehrere Elemente in einer vertikalen Liste darzustellen Mobile App Development ChristophKarls ListView • ListViews werden verwendet, um mehrere Elemente in einer vertikalen Liste darzustellen • XML <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView" android:entries="@array/lebensmittel" android:layout_gravity="center_horizontal" /> Mobile App Development ChristophKarls ListView • 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 ChristophKarls String-Array • Definition eines String arrays • res/values/strings.xml <resources> ... <string-array name="lebensmittel"> <item>Brot</item> <item>Schinken</item> <item>Käse</item> <item>Butter</item> <item>Bier</item> </string-array> </resources> Mobile App Development ChristophKarls String-Array • Zuweisung des String arrays an die Liste res/layout/activity_main.xml res/values/strings.xml <resources> ... <string-array name="lebensmittel"> <item>Brot</item> <item>Schinken</item> <item>Käse</item> <item>Butter</item> <item>Bier</item> </string-array> </resources> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView" android:entries="@array/lebensmittel" android:layout_gravity="center_horizontal" /> Mobile App Development ChristophKarls ListView • 2. Situation: Elemente erst zur Laufzeit bekannt • Verwendung eines Adapters, um die Liste zur Laufzeit zu befüllen Mobile App Development ChristophKarls SpinnerView • 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 ChristophKarls ListView • Auf Element Klicks reagieren ListView lv = (ListView) findViewById(R.id.listView); lv.setOnItemClickListener( new AdapterView.OnItemClickListener() { @Override public void onItemClick( AdapterView<?> parent, View view, int position, long id) { /* magic again ... */ } }); Mobile App Development ChristophKarls LayouLng 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 ChristophKarls LayoutParameter • 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 ChristophKarls LayoutParameter • Beispiel <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <Button android:id="@+id/button" android:layout_width=„wrap_content" android:layout_height=„fill_parent" android:text="Button" /> <Button android:id="@+id/button" android:layout_width=„fill_parent" android:layout_height=„fill_parent" android:text="Button" /> Mobile App Development ChristophKarls FrameLayout • wird in der Regel verwendet, um ein Element darzustellen • Layout-Attribut gravity <FrameLayout android:layout_width="260dp" android:layout_height="260dp" android:background="@android:color/darker_gray" android:layout_gravity="center_horizontal"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Button" /> </FrameLayout> Mobile App Development ChristophKarls FrameLayout auch mehrere, gestapelte Views • kann enthalten • Darstellung nach Einfügereihenfolge <FrameLayout android:layout_width="260dp" android:layout_height="260dp" android:background="@android:color/darker_gray" android:layout_gravity="center_horizontal"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="My Button" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="A large text for testing" android:id="@+id/textView" android:layout_gravity="center" /> </FrameLayout> Mobile App Development ChristophKarls LinearLayout • Ein LinearLayout richtet seine Kindelemente entlang einer bestimmt Richtung aus • Diese Richtung (Orientierung) kann horizontal und vertikal sein Mobile App Development ChristophKarls LinearLayout • Orientierung <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation=„horizontal" android:orientation=„vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/ButtonString" android:id="@+id/textView2" /> <EditText android:layout_width="173dp" android:layout_height="wrap_content" android:id="@+id/editText" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" /> </LinearLayout> Mobile App Development ChristophKarls 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:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="2" android:id="@+id/editText" /> Mobile App Development ChristophKarls LinearLayout • Beispiel Layout-Parameter weight weight weight weight TextField - - 1 EditText - 1 2 Button - - 3 Mobile App Development ChristophKarls 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 ChristophKarls TableLayout • Beispiel <TableLayout android:stretchColumns="*" android:gravity="center"> <TableRow android:gravity="center"> <TextView android:text="Large Text" android:id="@+id/textView4" /> <TextView android:text="Large Text" android:id="@+id/textView3" /> </TableRow> <TableRow android:gravity="center"> <Button android:text="New Button" android:id="@+id/button2" /> <Button android:text="New Button" android:id="@+id/button3" /> </TableRow> </TableLayout> Mobile App Development ChristophKarls 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 ChristophKarls TableLayout • Shrink-Attribut <TableLayout … android:shrinkColumns="*" <TableRow …> <Button … /> <Button … /> <Button … /> <Button … /> </TableRow> </TableLayout> Mobile App Development ChristophKarls 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 ChristophKarls TableLayout • Stretch-Attribut <TableLayout … android:stretchColumns=„0" android:stretchColumns=„1,2“ android:stretchColumns=„*" <TableRow …> … </TableRow> </TableLayout> Mobile App Development ChristophKarls RelaLveLayout • RelativeLayout wird verwendet, um Views relativ zu einander auszurichten • Nachteil: kompliziertes Layout • Vorteil: sehr flache View-Hierarchie und dadurch bessere Performance Mobile App Development ChristophKarls RelaLveLayout <RelativeLayout …> <TextView android:text="Example Application 1" android:id="@+id/tvHeadline" android:layout_alignParentTop="true" android:layout_alignParentEnd="true" /> <TextView android:text="Enter your Name" android:id="@+id/tvEnterName" android:layout_below="@+id/tvHeadline" android:layout_alignParentStart="true" /> <EditText android:id="@+id/etName" android:layout_below="@+id/tvEnterName" android:layout_alignParentStart="true" /> <Button android:text="Say Hello?" android:id="@+id/btnSayHello" android:layout_below="@+id/etName" android:layout_alignParentEnd="true" /> </RelativeLayout> Mobile App Development ChristophKarls RelaLveLayout • RelativeLayout.LayoutParams http://developer.android.com/reference/android/widget/ RelativeLayout.LayoutParams.html Mobile App Development ChristophKarls RelaLveLayout • RelativeLayout.LayoutParams http://developer.android.com/reference/android/widget/ RelativeLayout.LayoutParams.html Mobile App Development ChristophKarls <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 ChristophKarls <include/> • Beispiel <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="OK" android:id="@+id/btnOK" android:layout_weight="1" android:layout_gravity="center_horizontal" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Cancel" android:id="@+id/btnCancel" android:layout_weight="1" android:layout_gravity="right" /> </LinearLayout> Mobile App Development ChristophKarls <include/> • Beispiel <LinearLayout … <TextView … android:text="Example Application 1" android:id="@+id/tvHeadline" /> <LinearLayout … <TextView … android:id="@+id/tvEnterName" /> <EditText … android:id=„@+id/etName“ /> </LinearLayout> <include android:id="@+id/include" android:layout_width="fill_parent" android:layout_height="wrap_content" layout="@layout/layout_ok_cancel" /> </LinearLayout> Mobile App Development ChristophKarls PrakLkum Übung Übung 01 - Taschenrechner Es soll eine Taschenrechner-App erstellt werden, mit der einfache Berech- nungen durchgeführt werden können. Die App soll mindestens die Grundrechenarten Addition, Subtraktion, Mul- tiplikation 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 ver- wenden. 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. Mobile App Development ChristophKarls Literatur I. II. III. Arno Becker, Marcus Pant, Android 4.4, 3.Auflage, dpunkt.verlag, ISBN: 978-89864-809-7 Thomas Künneth: Android 3 - Apps entwickeln mit dem Android SDK Galileo Press, 2011 Mark L. Murphy, Commonsware, The Busy Coder’s Guide to Android Development IV. http://developer.android.com V. http://www.androidpit.de/de/android/wiki