简体   繁体   English

ConstraintLayout 中的 ConstraintLayout 在 Jetpack Compose 中不起作用

[英]ConstraintLayout inside ConstraintLayout not working in Jetpack Compose

I've two components Brand and SignInCreateAccount .我有两个组件BrandSignInCreateAccount Each component created by ConstraintLayout . ConstraintLayout创建的每个组件。 Now, I create WelcomeScreen from above components.现在,我从上面的组件创建WelcomeScreen

Usecase 1: WelcomeScreen using still ConstraintLayout ( ConstraintLayout inside ConstraintLayout )用例 1: WelcomeScreen使用仍然ConstraintLayoutConstraintLayoutConstraintLayout

@Composable
fun WelcomeScreen(modifier: Modifier = Modifier) {

    ConstraintLayout {
        val (brand, formSignIn) = createRefs()

        Brand(modifier = modifier.constrainAs(brand) {
            start.linkTo(parent.start)
            end.linkTo(parent.end)
            top.linkTo(parent.top)
        })

        SignInCreateAccount(modifier = modifier.constrainAs(formSignIn) {
            start.linkTo(brand.start)
            end.linkTo(brand.end)
            top.linkTo(brand.bottom)
        })
    }
}

Result: Layout preview not show anything结果:布局预览不显示任何内容

Usecase 2: WelcomeScreen using Column ( ConstrantLayout inside Column )用例2: WelcomeScreen使用ColumnConstrantLayoutColumn

@Composable
fun WelcomeScreen(modifier: Modifier = Modifier) {

    Column {
        Brand()
        SignInCreateAccount()
    }
}

Result: Layout preview show expected result结果:布局预览显示预期结果

Brand and SignInCreateAccount components Brand 和 SignInCreateAccount 组件

@Composable
fun SignInCreateAccount(modifier: Modifier = Modifier) {
    ConstraintLayout {
        val (titleSignIn, email, buttonContinue, titleOr, buttonSignGuest) = createRefs()

        Text(
            text = stringResource(id = R.string.sign_in_create_account),
            modifier = modifier.constrainAs(titleSignIn) {
                start.linkTo(parent.start)
                end.linkTo(parent.end)
                top.linkTo(parent.top)
            })

        Text(text = "... Enter your mail", modifier = modifier.constrainAs(email) {
            start.linkTo(titleSignIn.start)
            end.linkTo(titleSignIn.end)
            top.linkTo(titleSignIn.bottom)
        })
    }
}

@Composable
fun Brand(modifier: Modifier = Modifier) {
    ConstraintLayout {
        val (logo, slogan) = createRefs()

        Logo(modifier = modifier.constrainAs(logo) {
            start.linkTo(parent.start)
            end.linkTo(parent.end)
            top.linkTo(parent.top)
        })

        Text(text = stringResource(id = R.string.app_tagline),
            modifier = modifier.constrainAs(slogan) {
                start.linkTo(logo.start)
                end.linkTo(logo.end)
                top.linkTo(logo.bottom)
            })
    }
}

@Composable
fun Logo(
    modifier: Modifier = Modifier,
    lightTheme: Boolean = MaterialTheme.colors.isLight
) {
    val assetId = if (lightTheme) {
        R.drawable.ic_logo_light
    } else {
        R.drawable.ic_logo_dark
    }

    Image(
        painter = painterResource(id = assetId),
        modifier = modifier,
        contentDescription = null
    )
}

I want to using ConstraintLayout (as hobby) as use case 1. But I don't know what I did wrong or is there something wrong with ConstraintLayout .我想使用ConstraintLayout (作为爱好)作为用例 1。但我不知道我做错了什么或者ConstraintLayout有什么问题。

You are not passing the modifier parameter to the inner constraint layouts (ones in Brand and SignInCreateAccount ), so all the constraints you set on them from the WelcomeScreen don't get passed along, and therefore not appearing on the screen.您没有将修饰符参数传递给内部约束布局(在BrandSignInCreateAccount ),因此您从WelcomeScreen对它们设置的所有约束都不会传递,因此不会出现在屏幕上。

For example your Brand composable should like something like this:例如,您的Brand组合应该是这样的:

@Composable
fun Brand(modifier: Modifier = Modifier) {
    ConstraintLayout(modifier = modifier) {
        val (logo, slogan) = createRefs()

        Logo(modifier = modifier.constrainAs(logo) {
            start.linkTo(parent.start)
            end.linkTo(parent.end)
            top.linkTo(parent.top)
        })

        Text(text = stringResource(id = R.string.app_tagline),
            modifier = modifier.constrainAs(slogan) {
                start.linkTo(logo.start)
                end.linkTo(logo.end)
                top.linkTo(logo.bottom)
            })
    }
}

And the SignInCreateAccount would look like this SignInCreateAccount看起来像这样

@Composable
fun SignInCreateAccount(modifier: Modifier = Modifier) {
    ConstraintLayout(modifier = modifier) {
        val (titleSignIn, email, buttonContinue, titleOr, buttonSignGuest) = createRefs()

        Text(
            text = stringResource(id = R.string.sign_in_create_account),
            modifier = modifier.constrainAs(titleSignIn) {
                start.linkTo(parent.start)
                end.linkTo(parent.end)
                top.linkTo(parent.top)
            })

        Text(text = "... Enter your mail", modifier = modifier.constrainAs(email) {
            start.linkTo(titleSignIn.start)
            end.linkTo(titleSignIn.end)
            top.linkTo(titleSignIn.bottom)
        })
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Jetpack compose 中的 ConstraintLayout 问题 - Issue with ConstraintLayout in Jetpack compose 如何将 Jetpack Compose ConstraintLayout 与 Column 一起使用 - How to use Jetpack Compose ConstraintLayout together with Column 在 ConstraintLayout 中使用 Jetpack Compose 垂直滚动组件 - Use Jetpack Compose vertically scrollable component in ConstraintLayout LinearLayout中的ConstraintLayout无法正常工作 - ConstraintLayout inside LinearLayout not working ConstraintLayout中的ScrollView无法正常工作 - ScrollView inside ConstraintLayout is not working Android:约束布局在CardView中不起作用 - Android: constraintLayout not working inside CardView ConstraintLayout 中的 EditText 无法正常工作 - EditText inside ConstraintLayout not working properly Jetpack Compose 中是否有类似 ConstraintLayout 的“dimensionRatio”属性? - Is there something like ConstraintLayout's "dimensionRatio" property in Jetpack Compose? 我应该在 Android Jetpack Compose 中使用 ConstraintLayout 以获得更好的性能吗? - Should I use ConstraintLayout in Android Jetpack Compose for a better performance? ConstraintLayout 是否仍然优于 Jetpack Compose 中的嵌套列和行? - Is ConstraintLayout still preferred over nested Column & Row in Jetpack Compose?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM