【问题标题】:Android Compose ConstraintLayout issueAndroid撰写约束布局问题
【发布时间】:2021-04-22 14:44:13
【问题描述】:

撰写版本:1.0.0-beta04

constraintlayout-compose 版本:1.0.0-alpha05.

可组合:

@Composable
fun comp1() {
    Surface(Modifier
        .fillMaxWidth()
        .height(50.dp), color = Color.Red) {

        ConstraintLayout(Modifier.fillMaxSize()) {
            val guide_line = createGuidelineFromAbsoluteRight(.2f)
            val (icon_ref, box_ref, spacer_ref) = createRefs()
            
            Icon(Icons.Filled.Search, null,
                modifier = Modifier.constrainAs(icon_ref) {
                    absoluteLeft.linkTo(guide_line)
                    absoluteRight.linkTo(parent.absoluteRight)
                    top.linkTo(parent.top)
                    bottom.linkTo(parent.bottom)
                }
            ) 

            Box(Modifier
                .background(Color.Blue)
                .fillMaxSize()
                .constrainAs(box_ref) {
                    absoluteLeft.linkTo(parent.absoluteLeft)
                    absoluteRight.linkTo(guide_line)
                    top.linkTo(parent.top)
                    bottom.linkTo(parent.bottom)
                }) {}

            Spacer(Modifier
                .background(Color.Yellow)
                .width(2.dp)
                .fillMaxHeight()
                .constrainAs(spacer_ref) {
                    absoluteRight.linkTo(guide_line)
                })
        }
    }

}

预览:

如您所见,项目并没有像预期的那样受到限制。 view_based ConstraintLayout 中的视图不会在屏幕之外绘制,除非约束被弄乱或者是故意的。

【问题讨论】:

    标签: android android-jetpack-compose


    【解决方案1】:

    Box 可组合中删除fillMaxSize() 修饰符并应用约束width = Dimension.fillToConstraints

    类似:

    Surface(Modifier
        .fillMaxWidth()
        .height(50.dp), color = Color.Red) {
    
        ConstraintLayout(Modifier.fillMaxSize()) {
            val guide_line = createGuidelineFromAbsoluteRight(.2f)
            val (icon_ref, box_ref, spacer_ref) = createRefs()
    
            Icon(Icons.Filled.Search, null,
                modifier = Modifier.constrainAs(icon_ref) {
                    start.linkTo(guide_line)
                    end.linkTo(parent.end)
                    top.linkTo(parent.top)
                    bottom.linkTo(parent.bottom)
                }
            )
    
            Box(contentAlignment=Alignment.CenterStart,
                modifier = Modifier
                .background(Color.Blue)
                .fillMaxHeight()
                .constrainAs(box_ref) {
                    start.linkTo(parent.start)
                    end.linkTo(guide_line)
                    top.linkTo(parent.top)
                    bottom.linkTo(parent.bottom)
                    width = Dimension.fillToConstraints //ADD THIS
                }) {
    
                Text(text = "Text ", color = Yellow)
            }
    
            Spacer(Modifier
                .background(Color.Yellow)
                .width(2.dp)
                .fillMaxHeight()
                .constrainAs(spacer_ref) {
                    end.linkTo(guide_line)
                })
        }
    }
    

    【讨论】:

    • 不幸的是,这并不能解决问题,您的回答 Box 将不在屏幕上,尝试将 Text 添加到框的内容中,使用 Alignment.CenterStart ,您将看到文本的开头被切断了。
    • @yazansayed 你是对的。问题是在Box 中使用了修饰符fillMaxSize() 而不是约束width = Dimension.fillToConstraints。答案已更新。
    • 非常感谢,我想这应该是ConstraintLayout comp 中包含的任何可组合项的默认宽度和高度。 ,,如果你不介意也请看看这个问题:stackoverflow.com/questions/67159235/…
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2015-04-06
    • 2019-01-06
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多