我有两个组件品牌
和SignInCreateAccount
。每个组件都是由<code>ConstraintLayout</code>创建的。现在,我从上面的组件创建<code>WelcomeScreen</code>。
用例1:使用静态< code>ConstraintLayout(在< code>ConstraintLayout内的< code>ConstraintLayout)
@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)
})
}
}
结果:布局预览不显示任何内容
用例2:<代码>WelcomeScreen<代码>使用<代码>列<代码>(<代码>列<代码>内的<代码>ConstrantLayout<代码<)
@Composable
fun WelcomeScreen(modifier: Modifier = Modifier) {
Column {
Brand()
SignInCreateAccount()
}
}
结果:布局预览显示预期结果
品牌和SignInCreate帐户组件
@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
)
}
我想使用< code>ConstraintLayout(作为爱好)作为用例1。但是我不知道我做错了什么还是< code>ConstraintLayout有问题。
更新:我遗漏了内部约束布局的一个修饰符参数。然而,另一个问题出现了。该布局重新排列正确,但它没有显示任何东西:文本,图像。
< code>WelcomeScreen.kt
@Composable
fun WelcomeScreen(modifier: Modifier = Modifier) {
ConstraintLayout(modifier = modifier) {
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)
})
}
}
@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)
})
}
}
@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)
})
}
}
@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
)
}
@Preview
@Composable
fun DevPreview() {
JetsurveyTheme(darkTheme = false) {
WelcomeScreen()
}
}
您没有将修饰符参数传递给内部约束布局(在 Brand
和 SignInCreateAccount
中),因此您从 WelcomeScreen
对它们设置的所有约束都不会传递,因此不会显示在屏幕上。
例如,您的品牌
可组合应该像这样:
@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)
})
}
}
而signcreateAccount
将如下所示
@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)
})
}
}
我刚开始使用约束布局,我在编译设计文件时遇到断言错误,这个问题就会单独出现。解决此问题的正确方法是什么?我搞砸了洞日。这是我的XML设计。 和我的错误日志: java.lang.AssertionError:在Android.Support.Constraint.Solver.Widgets.Guideline.GetAnchor(Guideline.java:159)在Android.Suppo
我是android编程的新手,我还不知道很多事情。我在这里试图实现的是这样的东西。如果用户没有互联网连接,广告不会显示,或者如果广告由于某种原因没有加载,那么广告不会显示。但布局保持不变,这意味着广告空间是空的。我所做的是在一个相对的布局内扭曲广告视图,然后创建了一个函数,检查广告是否被加载,然后改变布局的可见性,这似乎工作,并解决了当广告不加载时的空白问题。但我认为这不是最好的方法,必须有更好的
我的约束布局的版本是。在我的布局中包含了一个工具栏之后,工具栏的左右两边都有空间,如下图所示 这是我的工具栏的代码 我以以下方式将其包含在我的布局中 我没有在布局文件的根元素中使用任何附加的填充或边距。 另一个奇怪的事情是,如果我编译或构建程序,我的代码会自动改变,比如 更改为
我是AutoLayout的新手。我已经知道很多关于这个autoLayout的问题和教程,但是我还没有找到我的解决方案。所以提前感谢您的任何帮助。 我的要求是什么? 我必须制作UIView,它将在按下屏幕底部带有动画的按钮后出现在屏幕上。(如键盘)。我使用autoLayout在xib文件中创建了此UIView。到目前为止,我已经这样做了。 在ViewDidLoad中: 在这个视图中,它包含(滚动视图
我正在学习布局。我不熟悉布局。我读了一些教程,对布局有了很好的了解。但当我尝试实现布局时,我正在努力适应所有屏幕。在这里,我附上了我的样本屏幕。我正在设计一个登录屏幕。我想让这种设计适合所有的屏幕。 当我在5英寸或6英寸的屏幕上看到这个设计时,它看起来不错。但当我看到4.7或更低的屏幕尺寸时,它不适合屏幕。请让我知道如何对所有屏幕大小使用约束布局。请为本课程提供一些示例/教程。