Layouts, Styling und Modifier
Dauer: 25 Minuten
- Layouts mit geschachtelten Composables
RowundColumn- Styling mit Parameter
- Modifiers für Layout und Verhalten
Ziel: Erste Schritte zu Layouts und Styling in Compose
Nun bauen wir das UI unserer Todo-App weiter aus. Hier stehen wir:
Vorstellung des Frameworks
- Installation und Einrichtung der Entwicklungsumgebung
- Prinzipien des Frameworks (Projektstruktur, Komponenten/Widgets, …)
- App mit einem Screen: UI-Elemente, Layout, Interaktion und State
- Daten lokal speichern
- Navigation zwischen mehreren Screens
Das Layout einer Android-App wird komplett in Kotlin-Code erstellt. Mit Compose können wir das UI deklarativ beschreiben, d.h. wir beschreiben, wie das UI aussieht, wenn es gerendert wird („was wird dargestellt anstatt wie wird es dargestellt“). Composables sind die Bausteine für das UI und können geschachtelt werden, womit wir komplexe Layouts erstellen können.
Row und Column
Mit den vordefinierten Layout-Composables Row
und Column können wir UI-Elemente nebeneinander oder
untereinander anordnen. Zunächst fügen wir einem Todo
eine Checkbox hinzu:
@Composable
fun Todo(text: String) {
Row {
Checkbox(checked = false, onCheckedChange = { })
Text(text)
}
}Row ist ein Composable, das die enthaltenen Composables
nebeneinander bzw. horizontal anordnet. Hier wird wieder mit { … }
ein Lambda-Ausdruck verwendet, um die in Row enthaltenen
Composables zu definieren. Das Lambda { } in Checkbox
ist zunächst leer, da wir noch kein Verhalten für die Checkbox
definiert haben. Checkbox ist eine Komponente aus dem
Material-Design (dazu später mehr).
Wir werden die Checkbox und den Text später in der vertikalen Mitte der Zeile einheitlich ausrichten.
Mehrere Todos können wir vertikal in einer Column anordnen:
@Composable
fun TodoList() {
Column {
Todo("Einkaufen")
Todo("Android lernen")
Todo("Sport machen")
}
}Hier haben wir gleich ein neues Composable TodoList erstellt,
das drei Todos enthält. Wir müssen dies noch in setContent
in MainActivity verwenden:
setContent {
TodoList()
}Gleich werden wir uns um das Aussehen bzw. Styling des Todos kümmern.
Später werden wir das Verhalten der Checkbox in einem Todo implementieren und eine „echte“ Liste von Todos erstellen.
Neben Row und Column ist Box ein weiteres grundlegendes Layout-Composable, welches die enthaltenen Elemente übereinander
darstellt.
Styling einzelner Composables
Für bestimmte Composables gibt es vordefinierte Parameter, um das Aussehen zu verändern. Zum Beispiel können wir den Text in einem Todo fett und größer darstellen:
@Composable
fun Todo(text: String) {
Row {
Checkbox(checked = false, onCheckedChange = { })
Text(text, fontWeight = FontWeight.Bold, fontSize = 22.sp)
}
}sp steht für scalable pixels und ist eine Maßeinheit, die für Text
bestimmt ist. Dabei wird die gewünschte Schriftgröße in den Systemeinstellungen
des Geräts berücksichtigt.
Es gibt auch die Einheit dp, die für density-independent pixels steht und
welche allgemeiner ist als die auf Text beschränkte Einheit sp. Damit
wird die Größe unabhängig von der Bildschirmauflösung angegeben.
Vordefinierte Composables wie Text haben unterschiedliche Parameter,
um das Aussehen bzw. Styling einzelner Composables zu verändern.
Manche Composables haben auch spezifische Layout-Parameter. Wir
können z.B. die vertikale Ausrichtung innerhalb einer Row bestimmen,
damit im Todo die Checkbox und der Text vertikal zentriert sind:
@Composable
fun Todo(text: String) {
Row(verticalAlignment = Alignment.CenterVertically) {
Checkbox(checked = false, onCheckedChange = { })
Text(text, fontWeight = FontWeight.Bold, fontSize = 22.sp)
}
}Für Alignment muss import androidx.compose.ui.Alignment importiert werden.
Oben wird nochmals die trailing lambda Syntax deutlich. Row erhält in
den runden Klammern einen Parameter verticalAlignment und in den
geschweiften Klammern wird der letzte Parameter von Row als ein Lambda-Ausdruck
definiert. Diese „kombinierte“ Syntax von Parametern ist in Kotlin und besonders in Compose sehr verbreitet.
Modifiers für Layout und Verhalten
Mit Modifiers können wir das Layout und das Verhalten von Composables verändern. Modifiers sind Kotlin-Objekte, die an Composables übergeben werden. Sie sind wiederverwendbar und allgemeiner als die eben gezeigten Parameter für das Styling einzelner Composables.
Ein Modifier kann z.B. mit padding einen Abstand um ein Composable
festlegen:
@Composable
fun Todo(text: String) {
Row(
modifier = Modifier.padding(10.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(checked = false, onCheckedChange = { })
Text(text, fontWeight = FontWeight.Bold, fontSize = 22.sp)
}
}Es gibt eine längere Liste von Modifiern: https://developer.android.com/develop/ui/compose/modifiers-list
Wenn mehrere Modifiers verwendet werden, können sie miteinander kombiniert werden, indem sie syntaktisch verkettet werden. Außerdem sind Modifiers nicht nur für Layout gedacht, sondern u.a. auch für das Verhalten. Hier machen wir ein Todo anklickbar:
@Composable
fun Todo(text: String) {
Row(
modifier = Modifier.clickable(onClick = {}).padding(10.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(checked = false, onCheckedChange = { })
Text(text, fontWeight = FontWeight.Bold, fontSize = 22.sp)
}
}Die Reihenfolgen von Modifier-Methoden ist manchmal wichtig.
Wenn wir im Beispiel oben clickable und padding vertauschen,
dann ist das Todo nicht mehr auf dem Rand anklickbar.
Nun wollen wir vielleicht, dass eine Zeile bzw. ein Todo sich
auf die komplette Bildschirmbreite erstreckt. Dafür gibt es den
Modifier fillMaxWidth:
@Composable
fun Todo(text: String) {
Row(
modifier = Modifier
.clickable(onClick = {})
.padding(10.dp)
.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(checked = false, onCheckedChange = { })
Text(text, fontWeight = FontWeight.Bold, fontSize = 22.sp)
}
}Dies lässt sich nun durch Anklicken eines Todos nachvollziehen.
Debug-Ausgaben mit Log.d sind manchmal nützlich, um Verhalten von
Composables zu überprüfen:
@Composable
fun Todo(text: String) {
Row(
modifier = Modifier
.clickable(onClick = { Log.d("MAIN_ACTIVITY", "Todo geklickt") })
.padding(10.dp)
.fillMaxWidth(),
) // Rest des Codes unverändert
}Die Ausgaben erscheinen in der Logcat-Ansicht in Android Studio.
Mehr zu Layout und Styling
Layout: https://developer.android.com/develop/ui/compose/layouts/basics
Modifiers: https://developer.android.com/develop/ui/compose/modifiers und die nachfolgenden Seiten