Entspricht dem Einschränkungslayout 0dp

Lesezeit: 2 Minuten

Freds Benutzeravatar
Fred

Ich habe versucht, mit Compose das folgende Layout zu erreichen:

Geben Sie hier eine Bildbeschreibung ein

Dafür habe ich das Composable erstellt:

@Preview(showBackground = true)
@Composable
fun element() {
    ConstraintLayout(
        modifier = Modifier.fillMaxWidth()
    ) {
        val (checkbox, title, icon) = createRefs()

        Text(
            text = "This would be some text",
            style = TextStyle(
                color = Color.Black,
                fontSize = 18.sp,
            ),
            modifier = Modifier.constrainAs(title) {
                top.linkTo(parent.top)
                bottom.linkTo(parent.bottom)
                start.linkTo(checkbox.end)
                end.linkTo(icon.start)
            },
        )

        Checkbox(
            checked = false,
            modifier = Modifier.constrainAs(checkbox) {
                top.linkTo(title.top)
                bottom.linkTo(title.bottom)
                start.linkTo(parent.start)
            },
            onCheckedChange = {},
        )

        Icon(
            asset = Icons.Filled.Close,
            modifier = Modifier
                .constrainAs(icon) {
                    top.linkTo(title.top)
                    bottom.linkTo(title.bottom)
                    end.linkTo(parent.end)
                }
        )
    }
}

Der zusammensetzbare Text füllt jedoch nicht den gesamten Raum aus und die Benutzeroberfläche sieht folgendermaßen aus:
Geben Sie hier eine Bildbeschreibung ein

Ich habe versucht, Modifikatoren hinzuzufügen Text zusammensetzbar wie Modifier..fillMaxWidth()aber das ergibt:

Geben Sie hier eine Bildbeschreibung ein

Ich habe auch versucht, einen Einschränkungssatz mit einer horizontalen Kette zu verwenden, aber ohne Erfolg. Ich kenne das Entfernen end.linkTo(icon.start) würde so aussehen, als ob dies erreichbar wäre, aber wenn der Text sehr lang wäre, würde er sich mit dem Löschsymbol überlappen.

Was fehlt mir hier? Wie erreiche ich das gleiche Ergebnis wie im Ansichtssystem, wenn wir das sagen? TextViewDie Breite beträgt 0dp?

Verwenden Dimension.fillToConstraints:

Eine Dimension, die sich entsprechend den Einschränkungen ausdehnt. Damit dies funktioniert, sollten Links von beiden Seiten entsprechend dieser Dimension angegeben werden.

Fügen Sie diese Zeile zu Ihrem hinzu Text Modifikator:

width = Dimension.fillToConstraints

Es wird also:

Text(
    text = "This would be some text",
    style = TextStyle(
        color = Color.Black,
        fontSize = 18.sp,
    ),
    modifier = Modifier.constrainAs(title) {
        top.linkTo(parent.top)
        bottom.linkTo(parent.bottom)
        start.linkTo(checkbox.end)
        end.linkTo(icon.start)
        width = Dimension.fillToConstraints
    },
)

  • Sehr schön! Eine Folgefrage: Haben Sie einen Link, wo dies erklärt wird? Danke!

    – Fred

    12. Okt. 2020 um 13:53 Uhr

  • Es ist da in einem Codelab komponieren im Abschnitt „Abmessungen anpassen“

    – Saurabh Thorat

    12. Okt. 2020 um 14:30 Uhr

  • Sie brauchen die Abhängigkeit implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-rc02" sehen Developer.android.com/jetpack/compose/layouts/…

    – Abstammung

    27. Dezember 2021 um 18:29 Uhr

  • @SaurabhThorat Gibt es eine Möglichkeit, eine doppelte Bedingung hinzuzufügen, zum Beispiel: width = Dimension.fillToConstraints, wenn der Text klein ist, und width = Dimension.wrapContent, wenn der Text groß ist?

    – Skizo-ozᴉʞS ツ

    16. März 2022 um 12:49 Uhr

  • das funktioniert jetzt nicht

    – Talha Akbar

    24. Mai 2022 um 11:08 Uhr

1453620cookie-checkEntspricht dem Einschränkungslayout 0dp

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy