Containerattribute festlegen

Sie können eine Grid-Containerkonfiguration definieren, um flexible Layouts zu erstellen, die auf unterschiedliche Bildschirmgrößen und Inhaltstypen reagieren. Auf dieser Seite wird Folgendes beschrieben:

Raster definieren

Ein Raster besteht aus Spalten und Zeilen. Die Grid zusammensetzbare Funktion hat einen config-Parameter , der eine Lambda-Funktion akzeptiert, um die Spalten und Zeilen in GridConfigurationScope zu definieren. Im folgenden Beispiel wird ein Raster mit drei Zeilen und zwei Spalten definiert, wobei jede eine feste Größe in Dp hat:

Grid(
    config = {
        repeat(2) {
            column(160.dp)
        }
        repeat(3) {
            row(90.dp)
        }
    }
) {
}

Elemente in einem Raster platzieren

Grid verwendet die UI-Elemente in der content-Lambda-Funktion und platziert sie in Rasterzellen. Die Elemente werden im Raster angeordnet, unabhängig davon, ob Sie die Zeilen und Spalten explizit definiert haben. Standardmäßig versucht Grid, ein UI-Element in der verfügbaren Rasterzelle in der Zeile zu platzieren. Wenn das nicht möglich ist, wird es in einer verfügbaren Rasterzelle in der nächsten Zeile platziert. Wenn keine leeren Zellen vorhanden sind, erstellt Grid eine neue Zeile.

Im folgenden Beispiel hat das Raster sechs Rasterzellen und in jeder wird eine Karte platziert (Abbildung 1). Jede Rasterzelle ist 160dp × 90dp groß, sodass die Gesamtgröße des Rasters 320dp × 270dp beträgt.

Grid(
    config = {
        repeat(2) {
            column(160.dp)
        }
        repeat(3) {
            row(90.dp)
        }
    }
) {
    Card1()
    Card2()
    Card3()
    Card4()
    Card5()
    Card6()
}

Sechs Karten werden in einem Raster mit drei Zeilen und zwei Spalten platziert.
Abbildung 1. Sechs Karten werden in einem Raster mit drei Zeilen und zwei Spalten platziert.

Wenn Sie dieses Standardverhalten ändern und die Elemente spaltenweise platzieren möchten, legen Sie die flow-Property auf GridFlow.Column fest.

Grid(
    config = {
        repeat(2) {
            column(160.dp)
        }
        repeat(3) {
            row(90.dp)
        }
        gap(8.dp)
        flow = GridFlow.Column // Grid tries to place items to fill the column
    },
) {
    Card1()
    Card2()
    Card3()
    Card4()
    Card5()
    Card6()
}

Die Flussfunktion ändert die Richtung, in der Elemente platziert werden.
Abbildung 2. GridFlow.Row (links) und GridFlow.Column (rechts).

Trackgröße verwalten

Zeilen und Spalten werden zusammen als ein Raster-Track bezeichnet. Sie können die Größe eines Raster-Tracks mit einer der folgenden Methoden angeben:

  • Fest (Dp): Weist eine bestimmte Größe zu (z.B. column(180.dp)).
  • Prozentual (Float): Weist einen Prozentsatz des insgesamt verfügbaren Platzes von 0.0f bis 1.0f zu (z.B. row(0.5f) für 50%).
  • Flexibel (Fr): Verteilt den verbleibenden Platz proportional, nachdem die festen und prozentualen Tracks berechnet wurden. Wenn beispielsweise zwei Zeilen auf 1.fr und 3.fr festgelegt sind, erhält die zweite Zeile 75% der verbleibenden Höhe.
  • Intrinsisch: Legt die Größe des Tracks basierend auf dem Inhalt fest. Weitere Informationen finden Sie unter Größe von Raster-Tracks intrinsisch bestimmen.

Im folgenden Beispiel werden die verschiedenen Optionen zur Größenbestimmung von Tracks verwendet, um die Zeilenhöhen zu definieren:

Grid(
    config = {
        column(1f)

        row(100.dp)
        row(0.2f)
        row(1.fr)
        row(GridTrackSize.Auto)
    },
    modifier = Modifier.height(480.dp)
) {
    PastelRedCard("Fixed(100.dp)")
        PastelGreenCard("Percentage(0.2f)")
    PastelBlueCard("Flex(1.fr)")
        PastelYellowCard("Auto")

}

Zeilenhöhen, die mit den vier primären Optionen für die Spaltengröße definiert werden.
Abbildung 3. Zeilenhöhen, die mit den vier primären Optionen zur Größenbestimmung von Tracks in Grid definiert wurden.

Größe von Raster-Tracks intrinsisch bestimmen

Sie können die intrinsische Größenbestimmung für ein Grid verwenden, wenn das Layout an den Inhalt angepasst werden soll, anstatt ihn in einen festen Container zu zwingen. Die Größe des Raster-Tracks wird mit den folgenden Werten bestimmt:

  • GridTrackSize.MaxContent: Die maximale intrinsische Größe des Inhalts verwenden. Die Breite wird beispielsweise durch die vollständige Länge des Texts in einem Textblock ohne Umbruch bestimmt.
  • GridTrackSize.MinContent: Die minimale intrinsische Größe des Inhalts verwenden. Die Breite wird beispielsweise durch das längste einzelne Wort in einem Textblock bestimmt.
  • GridTrackSize.Auto: Eine flexible Größe für einen Track verwenden, die sich an den verfügbaren Platz anpasst. Standardmäßig verhält sie sich wie MaxContent, wird aber verkleinert und der Inhalt wird umbrochen, damit er in den übergeordneten Container passt.

Im folgenden Beispiel werden zwei Texte nebeneinander platziert. Die Spaltengröße für den ersten Text wird durch die erforderliche Mindestbreite bestimmt, um den Text anzuzeigen. Die Breite der zweiten Spalte hängt von der erforderlichen maximalen Breite des Texts ab.

Grid(
    config = {
        column(GridTrackSize.MinContent)
        column(GridTrackSize.MaxContent)
        row(1.0f)
    },
    modifier = Modifier.width(480.dp)
) {
    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet.")
    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras imperdiet.")
}

Die in den Spalten angegebenen intrinsischen Größen.
Abbildung 4. Intrinsische Größen, die in den Spalten angegeben sind.

Abstände zwischen Zeilen und Spalten festlegen

Sobald die Größe der Raster-Tracks festgelegt ist, können Sie den Rasterabstand ändern, um den Abstand zwischen den Tracks zu optimieren. Sie können den Spaltenabstand mit der columnGap Funktion, und den Zeilenabstand mit rowGap angeben. Im folgenden Beispiel beträgt der Abstand zwischen den Zeilen 16dp und der Abstand zwischen den Spalten 8dp (Abbildung 5).

Grid(
    config = {
        repeat(2) {
            column(160.dp)
        }
        repeat(3) {
            row(90.dp)
        }
        rowGap(16.dp)
        columnGap(8.dp)
    }
) {
    Card1()
    Card2()
    Card3()
    Card4()
    Card5()
    Card6()
}

Lücken zwischen Zeilen und Spalten.
Abbildung 5. Abstände zwischen Zeilen und Spalten.

Sie können auch die praktische Funktion gap verwenden, um Abstände mit derselben Spalten- und Zeilengröße zu definieren, und Spalten- und Abstandsgrößen mit einer einzigen Funktion separat zu definieren. Mit dem folgenden Code werden dem Raster Abstände von 8dp hinzugefügt:

Grid(
    config = {
        repeat(2) {
            column(160.dp)
        }
        repeat(3) {
            row(90.dp)
        }
        gap(8.dp) // Equivalent to columnGap(8.dp) and rowGap(8.dp)
    }
) {
    Card1()
    Card2()
    Card3()
    Card4()
    Card5()
    Card6()
}