【问题标题】:fillMaxSize modifier not working when combined with VerticalScroll in Jetpack Compose与 Jetpack Compose 中的 VerticalScroll 结合使用时,fillMaxSize 修饰符不起作用
【发布时间】:2021-10-01 15:22:05
【问题描述】:

我尝试查找此内容,但找不到任何相关内容。

我想在可垂直滚动的Box 内有一个“全尺寸”Column,而这种组合似乎不起作用。当我将verticalScroll(rememberScrollState()) 修饰符添加到Box 时,它似乎“禁用”了ColumnfillMaxSize() 修饰符

以下代码没有按预期工作:

MyTheme {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .border(2.dp, Color.Green) //for visual effect only
                .verticalScroll(rememberScrollState())
        ) {
            Column(
                modifier = Modifier
                    .fillMaxSize()
                    .padding(2.dp)
                    .border(2.dp, Color.Red) //for visual effect only
            ) {
               //some content
            }
        }
}

预期结果:BoxColumn(绿色和红色边框)都填满了整个屏幕。

实际结果: Box 填满屏幕,但Column 没有填满高度

但是,如果我从 Box 中删除 verticalScroll() 修饰符,我会得到预期的结果:

MyTheme {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .border(2.dp, Color.Green) //for visual effect only
                //verticalScroll modifier removed
        ) {
            Column(
                modifier = Modifier
                    .fillMaxSize()
                    .padding(2.dp)
                    .border(2.dp, Color.Red) //for visual effect only
            ) {
               //some content
            }
        }
}

【问题讨论】:

  • 尝试将verticalScroll修饰符放在内栏。由于它已经填满了盒子的最大尺寸,我不明白你为什么要在盒子上放一个垂直滚动。
  • @Rafsanjani 这解决了我的具体问题,所以谢谢,但我的意图也是了解为什么会发生这种情况。所以即使我使用了你的解决方案,我也接受了 Philip Dukhov 的回答

标签: android kotlin android-jetpack-compose


【解决方案1】:

verticalScroll包裹了内容的高度,可以拉伸到很长,所以范围有Constraints.Infinity对于maxHeight的约束。

来自fillMaxHeightdocumentation

如果传入的最大高度是 Constraints.Infinity,则此修饰符将无效。

这就是为什么你需要明确设置height

考虑切换到LazyColumn(具有此确切用途的fillParentMaxHeight())或Pager(明确用于此类情况)。

另外,作为@AdrianK 指针,使用常规scrollable,您可以使用BoxWithConstraints 包裹您的视图,并使用maxHeight 设置您的视图的height

BoxWithConstraints {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .border(2.dp, Color.Green)
            .verticalScroll(rememberScrollState())
    ) {
        Column {
            repeat(2) {
                Column(
                    modifier = Modifier
                        // fillMaxWidth instead of fillMaxSize
                        .fillMaxWidth()
                        // explicit height modifier
                        .height(this@BoxWithConstraints.maxHeight)
                        .padding(2.dp)
                        .border(2.dp, Color.Red)
                ) {
                    //some content
                }
            }
        }
    }
}

结果:

【讨论】:

  • 我接受了这个答案,因为它解释了为什么会发生这种情况,但是我实际上使用了@Rafsanjani 解决方案
【解决方案2】:

您可以将您的布局包装成一个BoxWithConstraints,它不可滚动并从那里获取大小:

BoxWithConstraints {
    val pageSize = this.maxHeight // already provided as Dp value
    Box(
        modifier = Modifier
            .fillMaxSize()
            .border(2.dp, Color.Green) //for visual effect only
            .verticalScroll(rememberScrollState())
    ) {
        Column(
            modifier = Modifier
                .fillMaxWidth()
                .height(pageSize)
                .padding(2.dp)
                .border(2.dp, Color.Red) //for visual effect only
        ) {
            //some content
        }
        // just so we can scroll a bit further
        Spacer(modifier = Modifier.padding(top = pageSize).fillMaxWidth().height(72.dp))
    }
}

【讨论】:

  • 这不是一个糟糕的主意,尽管它感觉有点像 hack。但对于我的具体情况,@Rafsanjani 解决方案有效并且感觉更“干净”,所以我选择了这个
猜你喜欢
  • 2023-03-02
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2021-05-04
  • 2022-11-30
  • 1970-01-01
相关资源
最近更新 更多