kotlin 无法在桌面中设计用于合成的UI布局

lb3vh1jj  于 2023-02-09  发布在  Kotlin
关注(0)|答案(2)|浏览(167)

我正在为基于Compose for Desktop的应用程序开发UI布局
它包含几个复选框。
但是Compose for Desktop中没有将视图彼此对齐的功能。
在Android中,我们可以使用Constraint Layout进行视图对齐,这非常简单。
但是如何为桌面合成呢?
这是我需要在桌面合成中设计的布局

下面是我在Main.kt文件中编写的代码:但输出却大不相同。
由于没有针对桌面布局对齐和大小调整合成的官方文档/视频,请您提供指导。

@Composable
@Preview
fun App() {
    MaterialTheme(
    ) {
        BoxWithConstraints {
            TwoColumnsLayout()
        }
    }
}

@Composable
fun TwoColumnsLayout() {
    Row(Modifier.fillMaxSize()) {
        Box(modifier = Modifier.fillMaxWidth(0.4f), contentAlignment = Alignment.Center) {
            LeftPaneContent()
            Divider(
                color = Color.Blue,
                modifier = Modifier
                    .fillMaxHeight()
                    .width(1.dp)
            )
        }
        RightPaneContent()
    }
}

@Composable
fun LeftPaneContent() {
    Column(
        Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(text = "Left Pane First Text Box")
        Text(text = "Left Pane Second Text Box")
        Column {
            Text(text = "Left Pane Radio button Box  ", modifier = Modifier.padding(start = 8.dp))
            val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
        }
        Text(text = "Left Pane bottom Text Box")
    }
}

@Composable
fun RightPaneContent() {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Column(
            Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "Right Pane First Text Box")
            Text(text = "Right Pane Second Text Box")
            Text(text = "Right Pane Third Text Box")
        }
    }
}

fun main() = application {
    Window(
        onCloseRequest = ::exitApplication,
        state = WindowState(size = DpSize(1440.dp, 768.dp))
    ) {
        App()
    }
}

我不需要完整的代码。
我只是需要帮助的意见,根据上述设计的位置,对齐和大小。
我无法创建如上图所示的UI布局,也没有关于为桌面UI布局合成的文档。

egmofgnx

egmofgnx1#

ConstraintLayout是你在相当罕见的情况下需要的,在大多数情况下,合成布局就足够了。
您可以查看Compose Layout documentation,我认为它包含了丰富的类似布局示例-至少是其中的一部分。
你的代码中有很多错误,但是一般的方法是正确的,通过一些练习,你会发现使用它比使用ConstraintLayout更有趣。

  1. TwoColumnsLayout-不太清楚为什么你决定把左边的内容和分隔符放在Box中-它会把它们一个放在另一个上面。只要删除Box并留下内容。
  2. Modifier.fillMaxWidth(0.4f)可以直接移到LeftPaneContent中-添加fillMaxHeight并删除fillMaxSize。或者,您可以创建一个Modifier参数,以便可以从TwoColumnsLayout控制它。
  3. Modifier.weight(1f)仅用于Row/Column中的一个子视图,因此它占用了其他视图布局后的所有可用空间-更多信息请参见this answer
  4. LeftPaneContent-根据您的设计,如果您希望前两个文本大小相同,可能需要将它们放入Row中-将Modifier.weight(1f)添加到每个文本中。
  5. RightPaneContent-与第3点相同:您可能需要将第二个和第三个视图放在Row中。具有单个子视图的Box是多余的,可以删除。
  6. App内部的BoxWithConstraints也不使用,可以删除。
    也可以根据需要使用Spacer在视图和Modifier.padding之间添加间距。使用modifier作为最后一个参数也是一个好的做法-在这种情况下,当你需要添加/重新排序modifier时,你不必处理尾部逗号。
    这应该更接近您的预期布局:
@Composable
fun TwoColumnsLayout() {
    Row(Modifier.fillMaxSize()) {
        LeftPaneContent()
        Divider(
            color = Color.Blue,
            modifier = Modifier
                .fillMaxHeight()
                .width(1.dp)
        )
        RightPaneContent()
    }
}

@Composable
fun LeftPaneContent() {
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .fillMaxHeight()
            .fillMaxWidth(0.4f)
            .padding(20.dp)
    ) {
        Row {
            Text(text = "Left Pane First Text Box", modifier = Modifier.weight(1f))
            Text(text = "Left Pane Second Text Box", modifier = Modifier.weight(1f))
        }
        Spacer(Modifier.size(20.dp))
        Column(Modifier.weight(1f).border(1.dp, color = Color.Black)) {
            Text(text = "Left Pane Radio button Box  ", modifier = Modifier.padding(start = 8.dp))
            val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
        }
        Spacer(Modifier.size(100.dp))
        Text(text = "Left Pane bottom Text Box")
    }
}

@Composable
fun RightPaneContent() {
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.Start,
        modifier = Modifier
            .fillMaxSize()
            .padding(20.dp)
    ) {
        Text(text = "Right Pane First Text Box")
        Spacer(Modifier.size(20.dp))
        Row {
            Text(text = "Right Pane Second Text Box", modifier = Modifier.weight(1f))
            Spacer(Modifier.size(20.dp))
            Text(text = "Right Pane Third Text Box", modifier = Modifier.weight(1f))
        }
    }
}
ezykj2lf

ezykj2lf2#

不管第一个答案是什么,自2023年2月起,您不能在合成桌面中使用约束布局,请参见https://github.com/JetBrains/compose-jb/issues/353

相关问题