В Android Compose contraintLayout есть текст, который, если он длинный ->, выйдет за пределы родительского элемента.

Это мой код:

      @Preview
@Composable
private fun composable(){
    ConstraintLayout(
        modifier = Modifier
            .padding(all = 8.dp)
    ) {
        val (title, type) = createRefs()

        Image(
            painter = painterResource(R.drawable.ic_chat_grey),
            contentDescription = "Badge",
            colorFilter = ColorFilter.tint(
                colorResource(
                    id =  R.color.white
                )
            ),
            modifier = Modifier
                .size(28.dp)
                .constrainAs(type) {
                    top.linkTo(parent.top)
                    end.linkTo(parent.end)
                },
        )
        Text(
            text = "123456789009876554431213TEST12312312312TEST12312312334234TEST 123456789009876554431213TEST12312312312TEST12312312334234TEST 123456789009876554431213TEST12312312312TEST12312312334234TEST",
            modifier = Modifier.constrainAs(title) {
                top.linkTo(parent.top)
                end.linkTo(type.start)
            },
            fontSize = 16.sp,
            style = TextStyle(
                fontFamily = FontFamily.SansSerif,
                fontWeight = FontWeight.Light,
                color = colorResource(
                    id = R.color.white
                )
            ),
            textAlign = TextAlign.Start
        )
    }
}

И как видите, в начале текста me присутствует не весь:

Я попытался настроить текст так, чтобы он также был связан с родительским элементом ->, но тогда он всегда равен 0.dp, даже если текст не больше экрана. (с Dimension.fillToConstraint)

Что я делаю не так?

2 ответа

Новые ограничения для изображения:

      .constrainAs(type) {
    top.linkTo(parent.top)
    start.linkTo(parent.start)
    end.linkTo(title.start)
}

Для текста:

      .constrainAs(title) {
    top.linkTo(parent.top)
    end.linkTo(parent.end)
    start.linkTo(type.end)
}

Результат:

Аргументация:

В макетах с ограничениями важно иметь ограничения с 3 или 4 сторон. Таким образом, они оба ограничены одним и тем же верхом, но теперь изображение начинается в начале родительского элемента, текст заканчивается в конце родительского элемента, и они встречаются посередине, не перекрываясь.

*обратите внимание, я также немного увеличил отступы ConstraintLayout.

Проблема была в ваших ограничениях. Кроме того, вам необходимо указать ширину макета родительского ограничения, он будет считать его WrapContent. Вот обновленный код.

      @Preview
@Composable
private fun composable(){
    ConstraintLayout(
        modifier = Modifier
            .fillMaxWidth()
            .wrapContentHeight()
            .padding(all = 8.dp)
    ) {
        val (title, type) = createRefs()

        Image(
            painter = painterResource(R.drawable.ic_photo),
            contentDescription = "Badge",
            colorFilter = ColorFilter.tint(
                colorResource(
                    id =  R.color.white
                )
            ),
            modifier = Modifier
                .size(28.dp)
                .constrainAs(type) {
                    top.linkTo(parent.top)
                    start.linkTo(parent.start)
                    width = Dimension.wrapContent
                    height = Dimension.wrapContent
                },
        )
        Text(
            text = "123456789009876554431213TEST12312312312TEST12312312334234TEST 123456789009876554431213TEST12312312312TEST12312312334234TEST 123456789009876554431213TEST12312312312TEST12312312334234TEST",
            modifier = Modifier.constrainAs(title) {
                top.linkTo(parent.top)
                start.linkTo(type.end, 16.dp)
                end.linkTo(parent.end)
                width = Dimension.fillToConstraints
            },
            fontSize = 16.sp,
            style = TextStyle(
                fontFamily = FontFamily.SansSerif,
                fontWeight = FontWeight.Light,
                color = colorResource(
                    id = R.color.white
                )
            ),
            textAlign = TextAlign.Start
        )
    }
}