E-Book, Deutsch, 526 Seiten
Reihe: Rheinwerk Computing
Theis Einstieg in Kotlin
2. Auflage 2021
ISBN: 978-3-8362-8535-3
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection
Apps entwickeln mit Android Studio
E-Book, Deutsch, 526 Seiten
Reihe: Rheinwerk Computing
ISBN: 978-3-8362-8535-3
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection
Einfach und ohne Vorkenntnisse Kotlin lernen. Mit IntelliJ IDEA lernen Sie die Sprache kennen und steigen dann in die App-Entwicklung mit Android Studio ein. Lernen Sie Schritt für Schritt alle wichtigen Sprachkonzepte kennen. Erfahren Sie, wie Sie Bedienoberflächen programmieren, auf verschiedene Sensoren und Systemdienste zugreifen, Daten speichern, Audio- und Videoaufnahmen weiterverarbeiten und selbstverständlich auch, wie Sie Ihre Apps veröffentlichen.
Ganz gleich, ob Sie von Java umsteigen oder Programmieranfänger sind - Kotlin hat einiges zu bieten, was eingefleischte Anwender anderer Sprachen lockt und für Neulinge von vornherein ein Plus darstellt. Thomas Theis bleibt seinem anfängerfreundlichen Stil auch dann treu, wenn es ein wenig schwieriger wird.
Aus dem Inhalt:
- Alle Grundlagen der Programmierung
- IntelliJ IDEA und Android Studio installieren
- Verzweigungen, Schleifen und Co.
- Funktionen und funktionale Programmierung
- Layouts und Menüs aufbauen
- Standard-Dialoge
- Sensoren nutzen
- Spiele und Trainings entwickeln
- Datenbanken zur Speicherung
- Gestensteuerung
- Zugriffsrechte verwalten
Thomas Theis ist Dipl.-Ing. für Technische Informatik und arbeitet als Berater und Trainer. Seit vielen Jahren gibt er als EDV-Dozent Kurse in verschiedenen Programmiersprachen. Er ist Autor vieler erfolgreicher Fachbücher.
Autoren/Hrsg.
Weitere Infos & Material
Materialien zum Buch ... 20 1. Einführung ... 21 1.1 ... Kotlin und Android ... 21 1.2 ... Aufbau dieses Buchs ... 22 1.3 ... Installation von IntelliJ IDEA ... 23 1.4 ... Das erste Projekt ... 26 2. Variablen, Datentypen und Operatoren ... 29 2.1 ... Das erste Programm ... 29 2.2 ... Zeichenketten ... 31 2.3 ... Ganze Zahlen ... 33 2.4 ... Zahlen mit Nachkommastellen ... 37 2.5 ... Rechenoperatoren ... 43 2.6 ... Logische Werte ... 47 2.7 ... Nullbare Datentypen ... 51 3. Kontrollstrukturen ... 57 3.1 ... Verzweigungen mit »if« ... 57 3.2 ... Verzweigungen mit »when« ... 61 3.3 ... Schleifen mit Bedingungen ... 63 3.4 ... Schleifen über Bereiche ... 69 3.5 ... Ausnahmebehandlung ... 71 3.6 ... Eingaben des Benutzers ... 74 4. Daten strukturieren und speichern ... 79 4.1 ... Array ... 79 4.2 ... ArrayList ... 83 4.3 ... Speichern und Lesen in Textdateien ... 85 5. Funktionen ... 89 5.1 ... Grundlagen ... 89 5.2 ... Vorgabewerte ... 96 5.3 ... Variable Parameterlisten ... 97 5.4 ... Externe Funktionen ... 99 5.5 ... Rekursive Funktionen ... 101 5.6 ... Erweiterungsmethoden ... 102 5.7 ... Rückgabewerte destrukturieren ... 103 5.8 ... Anonyme Funktionen ... 105 5.9 ... Callback-Funktionen ... 108 5.10 ... Gültigkeit und Konstanten ... 113 5.11 ... Debugging ... 115 6. Zahlen, Texte und Zeit ... 121 6.1 ... Mathematik ... 121 6.2 ... Zahlensysteme und Bit-Operationen ... 125 6.3 ... Zeichenketten ... 129 6.4 ... Zeitangaben mit der Klasse Calendar ... 135 6.5 ... Zeitangaben mit den Local-Klassen ... 139 7. Datenstrukturen ... 143 7.1 ... Arrays, weitere Möglichkeiten ... 143 7.2 ... Sets ... 150 7.3 ... Maps ... 153 7.4 ... Umwandlungen ... 156 8. Objektorientierte Programmierung ... 159 8.1 ... Klassen und Objekte ... 160 8.2 ... Konstruktoren und Initialisierung ... 166 8.3 ... Einzigartige Objekte ... 173 8.4 ... Operatormethoden ... 178 8.5 ... Datenklassen ... 184 9. Vererbung und mehr ... 187 9.1 ... Ableitung von Klassen ... 187 9.2 ... Interfaces ... 193 9.3 ... Abstrakte Klassen ... 197
10. Entwicklung von Android-Apps ... 203 10.1 ... Installation von Android Studio ... 203 10.2 ... Die erste App ... 205 10.3 ... Ein Projekt im Android Studio ... 208 10.4 ... App auf virtuellem Gerät starten ... 215 10.5 ... App auf realem Gerät starten ... 222
11. Layout, Ressourcen und Ereignisse ... 225 11.1 ... Layout und Ressourcen ... 225 11.2 ... Tipps zur Arbeit mit Projekten ... 239 11.3 ... Ereignisse verarbeiten mit dem »View Binding« ... 243 11.4 ... Listener-Objekte ... 251 11.5 ... Logging ... 260
12. Views zur Eingabe und Auswahl ... 263 12.1 ... Texte und Zahlen eingeben ... 263 12.2 ... Werte einstellen mit SeekBars ... 269 12.3 ... Einfache Auswahl ... 274 12.4 ... Mehrfache Auswahl ... 278 12.5 ... Views für Bilder ... 284
13. Zeitangaben und zeitliche Abläufe ... 289 13.1 ... Datum und Uhrzeit eingeben ... 289 13.2 ... Datum auswählen mit CalendarView ... 294 13.3 ... Datum auswählen mit DatePickerView ... 296 13.4 ... Uhrzeit auswählen mit TimePickerView ... 299 13.5 ... Zeitliche Abläufe steuern ... 302 13.6 ... Mehrere zeitliche Abläufe ... 307
14. Weitere Layouts und Activitys ... 309 14.1 ... FrameLayout ... 309 14.2 ... Lebenszyklus einer Activity ... 315 14.3 ... Mehrere Activitys ... 317 14.4 ... Ergebnisse einer Activity ... 323 14.5 ... Listen und Tabellen ... 328
15. Gesten, Dialoge und Menüs ... 335 15.1 ... Antippen ... 335 15.2 ... Ziehen ... 339 15.3 ... Wischen ... 341 15.4 ... Zoomen ... 344 15.5 ... Dialoge ... 347 15.6 ... Benachrichtigungen ... 352 15.7 ... Aktionsmenü ... 356 15.8 ... Kontextmenüs ... 360
16. Transformationen und Animationen ... 365 16.1 ... Transformationen ... 365 16.2 ... Animationen ... 373 16.3 ... Interpolatoren ... 379 16.4 ... Kollisionen ... 383
17. App-Daten speichern ... 387 17.1 ... Schlüssel-Wert-Paare ... 387 17.2 ... Textdatei ... 390 17.3 ... SQLite-Datenbank ... 395
18. Sensoren und Audio ... 409 18.1 ... Sensoren für die Lage ... 409 18.2 ... Sensoren für die Umgebung ... 419 18.3 ... Audiodateien abspielen ... 424
19. Systemdienste ... 433 19.1 ... Einzelne Systemberechtigung ... 433 19.2 ... Mehrere Systemberechtigungen ... 439 19.3 ... Standort ermitteln ... 445 19.4 ... Content-Provider ... 450 19.5 ... Daten vorbereiten ... 457
20. Beispielprojekte ... 461 20.1 ... Rechentrainer »BruchTraining« ... 461 20.2 ... Reaktionsspiel »Quadrate« ... 469 20.3 ... Reaktionsspiel »Zoo« ... 476 Anhang ... 477 A ... Virtuelle Geräte verwalten ... 479 B ... App veröffentlichen ... 481 C ... Installationen unter Ubuntu Linux ... 491 D ... Installationen unter macOS ... 501 E ... Weiterführende Links ... 509 Index ... 511
2.4 Zahlen mit Nachkommastellen
Zahlen mit Nachkommastellen, auch Fließkommazahlen genannt, werden in Variablen des Datentyps Float oder in Variablen des Datentyps Double gespeichert. Float-Variablen sind nicht so genau wie Double-Variablen. Zudem verfügt der Datentyp Float über einen kleineren Zahlenbereich. Allerdings benötigen Float-Variablen weniger Speicherplatz.
Bei der Ausgabe werden die Nachkommastellen standardmäßig mithilfe des (englischen) Dezimalpunkts abgetrennt. Im Projekt ZahlKomma werden Float- und Double-Variablen anhand einiger Beispiele erläutert.
2.4.1 Datentyp »Float«
Es folgt zunächst Teil 1 des Projekt-Programms:
val f1 = 2.375f
var f2: Float
f2 = 1.0f / 7.0f
println("Float: $f1 $f2")
println("Grenzen: ${Float.MAX_VALUE} ${Float.MIN_VALUE}\n")
...
}
Listing 2.7 Projekt »ZahlKomma«, Teil 1 von 4
Der unveränderlichen Variablen f1 wird der Float-Wert 2.375f zugewiesen. Die Nachkommastellen und das Zeichen f am Ende sorgen dafür, dass sie zu einer Float-Variablen wird. Die veränderliche Variable f2 wird als Float-Variable deklariert. Sie erhält später ihren Wert als Ergebnis der Division der beiden Float-Werte 1.0f und 7.0f.
Die Klasse Float beinhaltet ebenso die Konstanten MIN_VALUE und MAX_VALUE mit den Grenzen des Zahlenbereichs.
Die Ausgabe dieses Programmteils:
Grenzen: 3.4028235E38 1.4E-45
Anhand der Ausgabe sehen Sie, dass Float-Werte nur mit einer Genauigkeit von sechs bis sieben Stellen nach dem Komma gespeichert werden. Zum Rechnen mit einer größeren Genauigkeit werden Double-Variablen benötigt.
Sehr große oder sehr kleine Werte werden im Exponentialformat ausgegeben. Die Angabe 1.5e9 würde der Zahl 1,5 × 109 entsprechen, also der Zahl 1.500.000.000. Die Angabe 1.5e-9 würde der Zahl 1,5 × 10–9 entsprechen, also der Zahl 0,0000000015. Die beiden Werte in der Ausgabe repräsentieren die Zahlen 3,4028235 × 1038 bzw. 1,4 × 10-45.
2.4.2 Datentyp »Double«
Nachfolgend Teil 2 des Programms:
...
val d1 = 2.375
var d2: Double
d2 = 1.0 / 7.0
println("Double: $d1 $d2")
println("Grenzen: ${Double.MAX_VALUE} ${Double.MIN_VALUE}\n")
...
}
Listing 2.8 Projekt »ZahlKomma«, Teil 2 von 4
Der unveränderlichen Variablen d1 wird der Double-Wert 2.375 zugewiesen, ohne f am Ende. Die Nachkommastellen sorgen dafür, dass sie zu einer Double-Variablen wird. Die veränderliche Variable d2 wird als Double-Variable deklariert. Sie erhält später ihren Wert als Ergebnis der Division der beiden Double-Werte 1.0 und 7.0.
Auch hier beinhaltet die zugehörige Klasse Double die Konstanten MIN_VALUE und MAX_VALUE mit den Grenzen des Zahlenbereichs.
Die Ausgabe dieses Programmteils:
Grenzen: 1.7976931348623157E308 4.9E-324
Sie sehen, dass Double-Werte mit einer Genauigkeit von 15 bis 16 Stellen nach dem Komma gespeichert werden. Zudem ist der Zahlenbereich wesentlich größer.
Versuchen Sie, einen Wert zuzuweisen, der oberhalb des Zahlenbereichs liegt, erscheint eine Warnung, und es wird der Wert Infinity (dt.: unendlich) angenommen. Mit diesem Wert können Sie keine Berechnungen mehr vornehmen. Versuchen Sie, einen Wert zuzuweisen, der unterhalb des Zahlenbereichs liegt, erscheint eine Warnung, und es wird der Wert 0 angenommen.
2.4.3 Exponentialwerte
Wie bereits erwähnt, bieten Exponentialwerte die Möglichkeit, mit sehr großen oder sehr kleinen Werten zu arbeiten, ohne viele Nullen vor oder nach dem Komma anzugeben. Ihre Werte werden im Code mithilfe eines e oder E gekennzeichnet. Es folgt Teil 3 des Programms:
...
val e1 = 1.5e9
val e2 = 1.5e-9
println("Exponential: $e1 $e2\n")
...
}
Listing 2.9 Projekt »ZahlKomma«, Teil 3 von 4
Die Ausgabe dieses Programmteils:
2.4.4 Formatierung
Soll eine Zahl mit Nachkommastellen formatiert, also auf eine bestimmte Anzahl an Nachkommastellen gerundet werden, haben Sie verschiedene Möglichkeiten.
Zunächst der vierte und letzte Teil des Programms:
import java.util.Locale
import kotlin.math.*
fun main() {
...
val nfg = NumberFormat.getInstance()
nfg.maximumFractionDigits = 3
println("DE-Format: " + nfg.format(d2))
val nfu = NumberFormat.getInstance(Locale.US)
nfu.maximumFractionDigits = 3
println("US-Format: " + nfu.format(d2))
println("Runden: " + round(d2 * 1e3) / 1e3)
}
Listing 2.10 Projekt »ZahlKomma«, Teil 4 von 4
Das Schlüsselwort import wird benötigt, um einem Programm zusätzliche Klassen oder Paketinhalte zur Verfügung zu stellen. Die Klasse NumberFormat aus dem Paket java.text bietet Möglichkeiten zur Formatierung von Zahlen.
Wird die statische Methode getInstance() der Klasse NumberFormat ohne Parameter aufgerufen, liefert sie ein Objekt der Klasse NumberFormat mit den im aktuellen System genutzten Formatangaben, hier also den deutschen Formatangaben. Diese beinhalten zum Beispiel ein Komma zur Abtrennung von Dezimalstellen einer Zahl.
Mithilfe der Eigenschaft maximumFractionDigits können Sie für ein solches NumberFormat-Objekt die maximale Anzahl an Nachkommastellen festlegen, auf die mithilfe dieser Formatangabe gerundet werden kann.
Die Methode format() liefert für ein NumberFormat-Objekt eine Zeichenkette. Diese beinhaltet den Wert, der als Parameter übergeben wird, im zuvor festgelegten Format.
Hinweis
Die Eigenschaft maximumFractionDigits dient in Kotlin zur Vereinfachung der Nutzung der beiden Methoden setMaximumFractionDigits() zum Festlegen der genannten Anzahl und getMaximumFractionDigits() zum Ermitteln der genannten Anzahl. Solche Eigenschaften stehen in Kotlin für viele Methoden zur Verfügung.
Statische Methoden werden nicht für ein bestimmtes Objekt einer Klasse ausgeführt, sondern für die gesamte Klasse. Mehr zur objektorientierten Programmierung sehen Sie in Kapitel 8.
Ein Objekt der Klasse Locale aus dem Paket java.util repräsentiert eine bestimmte Region inklusive der in dieser Region genutzten Formatangaben. Die gewünschte Region wird mithilfe einer Konstanten dieser Klasse festgelegt. Die Konstante US steht für die USA als Region.
Wird die Methode getInstance() mit einem Locale-Objekt als Parameter aufgerufen, liefert sie ein NumberFormat-Objekt mit den zugehörigen Formatangaben. Diese beinhalten zum Beispiel einen Punkt zur Abtrennung von Dezimalstellen einer Zahl.
Mit import kotlin.math.* werden alle Eigenschaften und Methoden des Pakets kotlin.math zur Verfügung gestellt. Die Methode round() dient zum Auf- und Abrunden einer Zahl mit Nachkommastellen auf eine ganze Zahl. In diesem Fall soll auf eine bestimmte Anzahl x an Nachkommastellen gerundet werden. Zu diesem Zweck wird die Zahl zunächst mit 10x multipliziert, anschließend gerundet, danach wieder durch 10x dividiert.
Die Ausgabe dieses letzten Programmteils:
US-Format: 0.143
Runden: 0.143
2.4.5 Hilfestellung von IntelliJ IDEA
An dieser Stelle erfolgt ein wichtiger thematischer Einschub. In Projekten müssen häufig zusätzliche Elemente importiert werden. Der Editor von IntelliJ IDEA (und später auch von Android Studio) hilft Ihnen dabei. Das wird am Beispiel des Programmteils aus Abschnitt 2.4.4 gezeigt.
Nehmen wir an, Sie haben noch keine import-Anweisung erstellt und notieren die nachfolgende Anweisung:
Der...