Equivalent of constraint layout 0dp

Viewed 5216

I've been trying to achieve the following layout with compose:

enter image description here

For this, I've created the composable:

@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)
                }
        )
    }
}

However, the text composable does not fill the entire space and the UI looks like: enter image description here

I've tried adding modifiers to the Text composable like Modifier..fillMaxWidth(), but this results in:

enter image description here

I've tried also to use a constraint set with a horizontal chain, but to no avail. I know that removing end.linkTo(icon.start) would look like this is achievable, but when the text would be really long it would overlap with the delete icon.

What am I missing here? How do I achieve the same result as in the view system when we say the TextView's width is 0dp?

1 Answers

Use Dimension.fillToConstraints:

A Dimension that spreads to match constraints. Links should be specified from both sides corresponding to this dimension, in order for this to work.

Add this line to your Text modifier:

width = Dimension.fillToConstraints

So it becomes:

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
    },
)
Related