Layouts, Styling und Modifier
Dauer: 25 Minuten
- Layouts mit geschachtelten Composables
Row
undColumn
- Styling mit Parameter
- Modifiers für Layout und Verhalten
Ziel: Erste Schritte zu Layouts und Styling in Compose
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 in Android 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(name: String) {
Row {
Checkbox(checked = false, onCheckedChange = { })
Text(name)
}
}
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).
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(name: String) {
Row {
Checkbox(checked = false, onCheckedChange = { })
Text(name, 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(name: String) {
Row(verticalAlignment = Alignment.CenterVertically) {
Checkbox(checked = false, onCheckedChange = { })
Text(name, fontWeight = FontWeight.Bold, fontSize = 22.sp)
}
}
Oben wird nochmals die trailing lambda Syntax deutlich. Row
erhält in
den runden Klammern einen Parameter verticalAlignment
und in den
geschweiften Klammern wird letzte Parameter von Row
als ein Lambda-Ausdruck
definiert. Diese Syntax ist in Kotlin und besonders in Compose sehr verbreitet.
Row
hat folgende Parameter zur Ausrichtung:
horizontalArrangement
: Ausrichtung der Elemente in der horizontalen Richtung mitArrangement
-EnumverticalAlignment
: Ausrichtung der Elemente in der vertikalen Richtung mitAlignment
-Enum
Für eine Column
gibt es entsprechend:
verticalArrangement
: Ausrichtung der Elemente in der vertikalen Richtung mitArrangement
-EnumhorizontalAlignment
: Ausrichtung der Elemente in der horizontalen Richtung mitAlignment
-Enum
Modifiers für Layout und Verhalten
Mit Modifiern 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(name: String) {
Row(
modifier = Modifier.padding(10.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(checked = false, onCheckedChange = { })
Text(name, 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(name: String) {
Row(
modifier = Modifier.clickable(onClick = {}).padding(10.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(checked = false, onCheckedChange = { })
Text(name, 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(name: String) {
Row(
modifier = Modifier
.clickable(onClick = {})
.padding(10.dp)
.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(checked = false, onCheckedChange = { })
Text(name, fontWeight = FontWeight.Bold, fontSize = 22.sp)
}
}
Dies lässt sich nun durch Anklicken eines Todos nachvollziehen.
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