android - 如何防止喷气背包组合脚手架在对话框中显示时占据屏幕的整个高度

标签 android android-jetpack-compose scaffold

我有一个具有 Base.Theme.AppCompat.Light.Dialog 的 android Activity 作为平板电脑上的主题,因此显示在对话框中。
当我使用 XML 布局时,我可以为布局设置一个带有包装内容的最小高度,这样它就可以

  • 当没有内容或内容很少时,至少要高 x dp。
  • 内容高于最小高度时的内容高
  • 当内容不适合屏幕高度时,与屏幕一样高,在这种情况下,我可以滚动

  • 使用 Jetpack Compose 的脚手架我正在努力重建这种行为。即使没有内容,对话框也总是与屏幕允许的一样高。
    我尝试了以下修饰符作为脚手架的参数:
  • Modifier.wrapContentHeight() - 对话框仍然和屏幕一样高
  • Modifier.defaultMinSize(minHeight = 250.dp) - 对话框仍然和屏幕一样高
  • Modifier.height(height = 250.dp) - 现在它变小了,但固定为那个大小,当有更多内容时不会增长
  • Modifier.requiredHeightIn(min = 250.dp, max = getMyScreenHeightinDp()) - 对话框仍然和屏幕一样高

  • 由于您可以使用 .height(...) 降低脚手架的高度修饰符我认为也应该可以重新创建包装内容行为。但是怎么做?

    最佳答案

    使用 requiredHeightIn确实有效,如下面的代码中测试的那样。在此列表中,高度从 150.dp 到 400.dp 不等。如果您只提供 10 件元素,则为 150.dp。当您添加更多项目时,它会增加高度,但最多只能达到 400.dp。
    但是,有一个问题。抽屉导航从屏幕左侧滑出,而不是从对话框左侧滑出。有办法解决这个问题。您可以用自己的自定义抽屉替换抽屉导航。我做过一次,它可以做到。

    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            startActivity(intent)
    
            setContent {
    
                Dialog(
                    onDismissRequest = {  },
                    properties = DialogProperties(dismissOnClickOutside = false)
                ) {
                    val scaffoldState = rememberScaffoldState()
                    val scope = rememberCoroutineScope()
                    Scaffold(
                        modifier = Modifier.requiredHeightIn(min = 150.dp, max = 400.dp),
                        scaffoldState = scaffoldState,
                        drawerContent = { Text("Drawer content") },
                        topBar = {
                            TopAppBar(
                                title = { Text("Simple Scaffold Screen") },
                                navigationIcon = {
                                    IconButton(
                                        onClick = {
                                            scope.launch { scaffoldState.drawerState.open() }
                                        }
                                    ) {
                                        Icon(Icons.Filled.Menu, contentDescription = "Localized description")
                                    }
                                }
                            )
                        },
                        floatingActionButtonPosition = FabPosition.End,
                        floatingActionButton = {
                            ExtendedFloatingActionButton(
                                text = { Text("Inc") },
                                onClick = { /* fab click handler */ }
                            )
                        },
                        content = { innerPadding ->
                            LazyColumn(contentPadding = innerPadding) {
                                items(count = 100) {
                                    Text(it.toString())
    
                                }
                            }
                        }
                    )
                }
            }
        }
    }
    

    关于android - 如何防止喷气背包组合脚手架在对话框中显示时占据屏幕的整个高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70288692/

    相关文章:

    android - Jetpack Compose - 用图案绘制弧线

    asp.net-mvc - 是否可以在一个命令中搭建多个 Controller ?

    ruby-on-rails - rails : Scaffold to automatically do one-to-many relationship

    java - 开始新 Activity 不会暂停当前 Activity

    android - 如何使放大/缩小停留在最终位置

    android - 如何在 Jetpack Compose Material 3 中制作 cradled FAB?

    grails - 字段插件-Grails表

    java - 如果我以更大的 block (即大于 1024 字节)上传大文件,会发生什么情况?

    android - 如何使用 Android MediaCodec 生成 AAC ADTS 基本流

    android-jetpack-compose - 我们如何在 jetpack compose 中创建一个圆形复选框?