WS15-MADA-03-GUIs-2
Transcription
WS15-MADA-03-GUIs-2
MobileApp Development - Grafische Oberflächen 2 - Inhalt • Dimensionen • Layouting • Menüs • Activities starten • Übung Mobile App Development ChristophKarls Dimensionen Dimensionen • Analog zu Strings und Farben können Dimensionen definiert werden • Dimensionen sind Zahlen gefolgt von einer Einheit Mobile App Development ChristophKarls Dimensionen • Analog zu Strings und Farben können Dimensionen definiert werden • Dimensionen sind Zahlen gefolgt von einer Einheit res/values/dimens.xml <resources> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> </resources> Mobile App Development ChristophKarls Dimensionen • Pixel (px) • entsprechen den tatsächlichen Pixeln auf dem Endgerät • Verwendung wird nicht empfohlen, da die Darstellung von der Pixeldichte des Endgerätes abhängt Mobile App Development ChristophKarls Dimensionen • Pixel (px) • Beispiel <Button android:id="@+id/Button01" android:text="@string/mybutton" android:width="320px" /> 2,54 cm 5,08 cm 320 dpi 160 dpi Mobile App Development ChristophKarls Dimensionen • Density Independent Pixels (dp, dip) • unabhängig von der Auflösung des Displays • 1dp = 1px (bei 160dpi) • 1px = 1dp * (Auflösung / 160) Mobile App Development ChristophKarls Dimensionen • Scale Independent Pixels (sp) • das gleiche wie dp • zusätzlich abhängig von der Schriftgröße-Einstellung des Benutzers Mobile App Development ChristophKarls Dimensionen • Pixeldichte-unabhängige Einheiten • Point (pt) • ein Point entspricht 1/72 Zoll • Millimeter (mm) • Inch (in) Mobile App Development ChristophKarls Dimensionen • Definition: Dimensionen werden analog zu Farben und Strings in einer Resourcen-Datei abgelegt (dimens.xml) • Beispiel: <resources> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <dimen name="myTextSize">60sp</dimen> <dimen name="myWidth">25dp</dimen> <dimen name="myBorder">16px</dimen> <dimen name="myFontSize">23pt</dimen> <dimen name="myMargin">5mm</dimen> <dimen name="mySpace">17in</dimen> </resources> Mobile App Development ChristophKarls Dimensionen • Verwendung in XML res/values/dimens.xml <resources> <dimen name="myTextSize">60sp</dimen> </resources> res/layout/myactivity.xml <RelativeLayout … <TextView android:text="Hello World!" android:textSize="@dimen/myTextSize" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> Mobile App Development ChristophKarls Dimensionen • programmatische Verwendung res/values/dimens.xml <resources> <dimen name="myTextSize">60sp</dimen> </resources> public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); float dim = getResources().getDimension(R.dimen.myFontSize); } } Mobile App Development ChristophKarls Layou9ng Layou9ng • Problemstellung • verschiedene Display-Größen • verschiedene Auflösungen • verschiedene Orientierungen Mobile App Development ChristophKarls Layou9ng • Beispiel Orientierung Mobile App Development ChristophKarls Layou9ng • Beispiel Orientierung • Was fällt auf ?? Mobile App Development ChristophKarls Layou9ng • Wie wäre es mit verschiedenen Layouts? Mobile App Development ChristophKarls Layou9ng • Und was ist mit Display- ... • Auflösung • Größe • Format Bildquelle: http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources Mobile App Development ChristophKarls Layou9ng • Android ermöglicht die Erstellung von Layouts für verschiedene DisplayKonfigurationen • Unterscheidbare Eigenschaften • Größe • Orientierung • Pixeldichte Mobile App Development ChristophKarls Layou9ng • Mögliche Displaygrößen • klein (ca. 2 - 3,5 Zoll) • normal (3,2 - 4 Zoll) • groß (4 - 7 Zoll) • sehr groß (7 - 10 Zoll) Bildquelle: http://developer.android.com/guide/practices/screens_support.html Mobile App Development ChristophKarls Layou9ng • Definition von Layouts für verschiedene Display-Größen • Je Display-Größe wird ein Layout-Ordner angelegt • layout-small • layout-normal • layout-large • layout-xlarge Mobile App Development ChristophKarls Layou9ng • Das Layout kann für die verschiedenen Größen verschieden definiert werden • Achtung: Die Layout-Datei muss in jedem Ordner den gleichen Name haben Mobile App Development ChristophKarls Layou9ng • Es kann, muss aber nicht, für jede Größe eine Layout-Datei angelegt werden • Android wählt bei Fehlen eines Layouts für eine bestimmte Größe ein anderes aus Mobile App Development ChristophKarls Layou9ng • Wie werden die verschiedenen Layouts der Activity zugewiesen? public class MainActivity extends Activity { ... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* ... alles bleibt beim alten Android entscheidet */ setContentView(R.layout.activity_main); } ... } Mobile App Development ChristophKarls Layou9ng • Ist es möglich in der einen Layout- Definition andere Views zu definieren, als in einer anderen? Mobile App Development ChristophKarls Layou9ng • Ist es möglich in der einen Layout- Definition andere Views zu definieren, als in einer anderen? Name Vorname Name Straße Vorname Hausnummer Mobile App Development ChristophKarls Layou9ng • Ist es möglich in der einen Layout- Definition andere Views zu definieren, als in einer anderen? • Ja, es ist möglich! • Es ist zu beachten, dass in der Activity dann Fallunterscheidungen vorgenommen werden müssen Mobile App Development ChristophKarls Layou9ng • Fallunterscheidung Display-Größe Configuration conf = getResources().getConfiguration(); switch (conf.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) { case Configuration.SCREENLAYOUT_SIZE_SMALL: { /* do your small stuff */ break; } case Configuration.SCREENLAYOUT_SIZE_NORMAL: { /* do your normal stuff */ break; } case Configuration.SCREENLAYOUT_SIZE_LARGE: { /* do your large stuff */ break; } default : { /* do your unknown stuff */ break; } } Mobile App Development ChristophKarls Layou9ng • Display-Größe ab Android 3.2 • Problem: generalisierte Größenklassen führen zu Problemen • 5“ und 7“ würden in gleiche Klasse fallen Mobile App Development ChristophKarls Layou9ng • Ab Android 3.2 werden neue Qualifier für die Display-Größe verwendet • smallestWidth • screenWidth • screenHeight • Sie geben die minimale Breite/Höhe an, die für das Layout benötigt wird Mobile App Development ChristophKarls Layou9ng • smallestWidth • gibt die minimale Breite bzw. Höhe in dp an, die das Layout benötigt • unabhängig von der Orientierung, d.h. es wird sowohl in horizontaler als auch vertikaler Orientierung diese Breite/ Höhe benötigt Mobile App Development ChristophKarls Layou9ng • smallestWidth Layout • Anlegen eines Ordners layout-sw<N>dp • <N> steht für die minimale Größe in dp, die horizontal und vertikal benötigt wird (hier: 320dp) Mobile App Development ChristophKarls Layou9ng • screen width • gibt die minimale Breite an, die das Layout benötigt • abhängig von der Orientierung, da sich die Breite ändert, wenn das Gerät gedreht wird Mobile App Development ChristophKarls Layou9ng • screen width Layout • Anlegen eines Ordners layout-w<N>dp • <N> steht für die minimale Breite in dp, die benötigt wird (hier: 240dp) Mobile App Development ChristophKarls Layou9ng • screen height • gibt die minimale Höhe an, die das Layout benötigt • abhängig von der Orientierung, da sich die Höhe ändert, wenn das Gerät gedreht wird Mobile App Development ChristophKarls Layou9ng • screen height Layout • Anlegen eines Ordners layout-h<N>dp • <N> steht für die minimale Höhe in dp, die benötigt wird (hier: 480dp) Mobile App Development ChristophKarls Layou9ng • Orientierung • Android unterscheidet 2 Qualifier • Portrait (port) • Landscape (land) Mobile App Development ChristophKarls Layou9ng • Layouts für Orientierungen anlegen • gleiches Vorgehen wie bei Display-Größen • je Orientierung wird ein Ordner angelegt • für jede Orientierung wird ein Layout angelegt Mobile App Development ChristophKarls Layou9ng • Fallunterscheidung Orientierung Configuration conf = getResources().getConfiguration(); switch (conf.orientation) { case Configuration.ORIENTATION_PORTRAIT: { /* do your portrait stuff */ Log.d("TAG", "orientation: portrait"); break; } case Configuration.ORIENTATION_LANDSCAPE: { /* do your landscape stuff */ Log.d("TAG", "orientation: landscape"); break; } default : { Log.d("TAG", "orientation: unspecified"); break; } } Mobile App Development ChristophKarls Layou9ng • Layouts für verschiedene Auflösung • Android unterscheidet 4 Qualifier • ldpi, mdpi, hdpi, xhdpi Bildquelle: http://developer.android.com/guide/practices/screens_support.html Mobile App Development ChristophKarls Layou9ng • Layouts für verschiedene Auflösungen definieren • Analog zu Display-Größe und Orientierung werden Ordner für die einzelnen Auflösungen angelegt Mobile App Development ChristophKarls Layou9ng • Fallunterscheidung Auflösung /* create a DisplayMetrics object */ DisplayMetrics metrics = new DisplayMetrics(); /* requesting metrics from default display */ getWindowManager().getDefaultDisplay().getMetrics(metrics); /* switch density */ switch (metrics.densityDpi) { case DisplayMetrics.DENSITY_LOW: { /* do your low stuff */ break; } case DisplayMetrics.DENSITY_MEDIUM: { /* do your medium stuff */ break; } case DisplayMetrics.DENSITY_HIGH: { /* do your high stuff */ break; } case DisplayMetrics.DENSITY_XHIGH: { /* do your extra high stuff */ break; } } Mobile App Development ChristophKarls Layou9ng • Wie definiert man ein Layout für einen small Screen mit mittlerer Auflösung? Mobile App Development ChristophKarls Layou9ng • Die Qualifier für Größe, Orientierung usw. können kombiniert werden • Die Reihenfolge der Qualifier ist nicht beliebig! dazu: • siehe http://developer.android.com/guide/ topics/resources/providingresources.html#QualifierRules Mobile App Development ChristophKarls Layou9ng • Neben Größe, Orientierung und Auflösung existieren noch weitere Qualifier • Sprache/Region: de-rDE, en-rUS • Aspect Ratio: long, not long • Night mode: night, notnight Qualifier unter: • weitere http://developer.android.com/guide/topics/resources/ providing-resources.html#AlternativeResources Mobile App Development ChristophKarls Menüs Menüs Menüs werden verwendet, um dem Benutzer Aktionen und Optionen in einem bestimmten Kontext anzuzeigen Mobile App Development ChristophKarls Menüs • Unterscheidung zwischen Optionsmenüs Mobile App Development Kontextmenüs ChristophKarls Popup-Menüs Menuerstellen • Anlegen einer neuen Menü XML Datei im Ordner res/menu Mobile App Development ChristophKarls Menuerstellen • Anlegen einer neuen Menü XML Datei im Ordner res/menu Mobile App Development ChristophKarls Menüserstellen • das Menü erstellen <?xml version="1.0" encoding="utf-8"?> … <item android:id="@+id/menu_new" android:title="@string/yes"/> <item android:id="@+id/menu_edit" android:title="@string/we"/> <item android:id="@+id/menu_search" android:title="@string/can"/> </menu> Mobile App Development ChristophKarls Menüserstellen • Untermenüs <menu … <item android:id="@+id/menu_new" android:title="@string/menu_new"> <menu> <item android:id="@+id/menu_file" android:title="@string/menu_file"> </item> <item android:id="@+id/menu_folder" android:title="@string/menu_folder"> </item> </menu> </item> <item android:id="@+id/menu_edit" android:title="@string/menu_edit"/> … </item> Mobile App Development ChristophKarls Menüserstellen • Für jedes angelegte Menü wird ein gleichnamiger Eintrag in der R.java angelegt public final class R { ... public static final class menu { public static final int activity_main=0x7f060000; public static final int second_menu=0x7f060001; } ... } Mobile App Development ChristophKarls Op9onsmenüs • Verwendung als Optionsmenü • Optionsmenüs werden verwendet, um dem Benutzer im Kontext der aktuellen Activity Optionen und Aktionen zu Verfügung zu stellen Mobile App Development ChristophKarls Op9onsmenüs • Menü als Optionsmenü verwenden public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { … } @Override public void onCreateContextMenu( ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { /* Inflater wird verwendet, um aus XML Java Objekte zu erzeugen */ MenuInflater inflater = getMenuInflater(); /* Erstellen des Menüs aus der XML Ressource unter Angabe der Menü ID */ inflater.inflate(R.menu.menu_new, menu); } … } Mobile App Development ChristophKarls Op9onsmenüs • Auf Menü-Klicks reagieren @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_edit: { showToast("EDIT"); return true; } case R.id.menu_file: { showToast("FILE"); return true; } … } default: { } } return super.onOptionsItemSelected(item); } Mobile App Development ChristophKarls Kontextmenüs • Das Menü als Kontextmenü verwenden • Kontextmenüs werden verwendet, um dem Benutzer im Kontext einer bestimmten View ein Menü zur Verfügung zu stellen Mobile App Development ChristophKarls Kontextmenüs • Das Menü als Kontextmenü verwenden @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } TextView tv = (TextView) findViewById(R.id.tvHelloWorld); registerForContextMenu(tv); @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { /* Inflater wird verwendet, um aus XML Java Objekte zu erzeugen */ MenuInflater inflater = getMenuInflater(); /* Erstellen des Menüs aus der XML Ressource unter Angabe der Menü ID */ inflater.inflate(R.menu.menu_new, menu); } Mobile App Development ChristophKarls Kontextmenüs • Auf Klicks im Kontextmenü reagieren @Override protected void onCreate(Bundle savedInstanceState) { /* Menü registrieren */ } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { /* Menü erstellen */ } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_edit: { showToast("EDIT"); return true; } case R.id.menu_file: { showToast("FILE"); return true; } … default: { } } return super.onContextItemSelected(item); } Mobile App Development ChristophKarls Popup-Menüs • Das Menü als Popup-Menü verwenden • Popup-Menüs werden verwendet, um im Kontext einer Aktion weitere Optionen zur Verfügung zu stellen • Popup-Menüs stehen ab APILevel 11 zur Verfügung Mobile App Development ChristophKarls Popup-Menüs • Das Menü als Popup-Menü verwenden <Button android:text="Can u pop up?" android:id="@+id/button" android:onClick="btnPopupClick" …/> public void btnPopupClick(View view) { /* Erzeugen eines neuen Popup-Menüs */ PopupMenu popup = new PopupMenu(MainActivity.this, view); /* menuInflater-Referenz vom Popup holen */ MenuInflater inflater = popup.getMenuInflater(); /* Menü aus XML erstellen */ inflater.inflate(R.menu.menu_new,popup.getMenu()); /* Popup anzeigen */ popup.show(); } Mobile App Development ChristophKarls Popup-Menüs • Auf Klicks im Popup-Menü reagieren public void btnPopupClick(View view) { /* Erzeugen eines neuen Popup-Menüs */ PopupMenu popup = new PopupMenu(MainActivity.this, view); /* menuInflater-Referenz vom Popup holen */ MenuInflater inflater = popup.getMenuInflater(); /* Menü aus XML erstellen */ inflater.inflate(R.menu.menu_new,popup.getMenu()); /* Popup anzeigen */ popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.menu_file: /* todo */ return true; case R.id.menu_edit: /* todo */ return true; default: return false; } } }); popup.show(); } Mobile App Development ChristophKarls Ac9onBar Hardware-BuEon? • http://android-developers.blogspot.de/ 2012/01/say-goodbye-to-menu-button.html Mobile App Development ChristophKarls Ac9onBar • seit Android 3.0 kein Hardware MenüButton mehr notwendig • Einführung der ActionBar • API Level 11 + Theme.Holo Mobile App Development ChristophKarls Ac9onBar • Die ActionBar füllen • gleiches Vorgehen, wie bei Optionsmenüs • Erstellen einer Menu-Datei res/menu/ <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_new" android:icon="@android:drawable/ic_input_add" android:title="@string/menu_new"/> <item android:id="@+id/menu_delete" android:icon="@android:drawable/ic_delete" android:title="@string/menu_delete"/> </menu> Mobile App Development ChristophKarls Ac9onBar • Die ActionBar füllen • Das Menü aus XML erstellen @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; // this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_actionbar, menu); return true; } Mobile App Development ChristophKarls Ac9onBar • Auf ActionBar Klicks reagieren @Override public boolean onOptionsItemSelected(MenuItem item) { /* switch über die MenuItem ID */ switch (item.getItemId()) { case R.id.menu_new: { /* ... todo ... */ return true; } case R.id.menu_delete: { /* ... todo ... */ return true; } default: { return super.onOptionsItemSelected(item); } } } Mobile App Development ChristophKarls Ac9onBar • ActionBar Menü-Einträge anpassen • showAsAction gibt an, wie das Menüelment in der ActionBar angezeigt wird (API Level 11 !) <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:title="@string/menu_new" android:id="@+id/menu_new" android:icon="@android:drawable/ic_input_add" app:showAsAction="always" /> … </menu> Mobile App Development ChristophKarls Ac9onBar • ActionBar Menü-Einträge anpassen • showAsAction Werte • always: Element wird immer angezeigt • ifRoom: Element wird nur angezeigt, wenn genügend Platz ist • never: Element wird immer im Overflow angezeigt Mobile App Development ChristophKarls Prak9kum Prak9kum Übung 02: Erweiterung Taschenrechner Die Taschenrechner-App aus der letzten Übung soll erweitert werden. Über einen Menüeintrag „Weitere“ sollen in einem Untermenü die zusätzlichen Rechenoperationen Sinus, Kosinus, Tangens und Quadratwurzel auswählbar sein. Außerdem soll die App für zwei verschiedene Layouts optimiert werden, zum einen für ein Smartphone (default Layout) und zum anderen für ein Tablet (ca. 7“ - 10“). Es ist darauf zu achten, dass auf dem Tablet mehr Platz zur Verfügung steht als auf einem Smartphone, sodass die o.g. zusätzlichen Rechenoperationen in der Tablet Version nicht über ein Menü zur Verfügung gestellt werden müssen, sondern direkt mit angezeigt werden können. Wie beim letzten Praktikum kann auch in dieser Übung die Bibliothek exp4j (http:// www.objecthunter.net/exp4j) verwendet werden. Mobile App Development ChristophKarls