当前位置: 首页 > 知识库问答 >
问题:

通过 ComposeView 互操作在 CoordinatorLayout 内部编写 LazyColumn 滚动行为

堵鸿光
2023-03-14

问题-向下滚动导致底部工作表滚动,而不是优先滚动LazyColumn (RecyclerView没有这个问题。它被一个嵌套的卷视图包裹着

我刚刚在协调器布局中引入了对Recycler的Compose LazyCol列替换。协调器(作为底部工作表实现)本身可以在窥视和扩展状态之间自由滚动。我的问题是当在LazyCol列中向下拖动项目区域时,底部工作表会拾取滚动而不是LazyCol列。如果我在LazyCol列上先向上滚动,然后向下滚动(不释放),滚动将由LazyCol列拾取,滚动优先级将赋予LazyCol列(预期行为)。

BottomSheetFragment
|-CoordinatorLayout
|--ConstraintLayout (BottomSheetBehavior)
|---MyListFragment
|----ComposeView
|-----Theme
|------Surface
|-------Box
|--------LazyColumn

“撰写”新手,所以我希望有人能告诉我如何纠正这个新的滚动行为?

**编辑:通过切换协调器的^^行为,我得到了这项工作的一部分。isDragglable,但它确实需要我释放拖动,而不是从列表滚动平滑过渡到底部工作表滚动-有人建议修复吗?:

fun MyUi(listener:Listener) {
    val listState = rememberLazyListState()

    LaunchedEffect(listState) {
        listState.interactionSource.interactions.collect {
            //at the top of the list so allow sheet scrolling
            listener.allowSheetDrag(listState.firstVisibleItemScrollOffset == 0)
        }
    }

    val nestedScrollConnection = remember {
        object : NestedScrollConnection {
            override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
                Timber.i("NestedScrollConnection onPreScroll($available: Offset, $source: NestedScrollSource)")
                return super.onPreScroll(available, source)
            }

            override fun onPostScroll(consumed: Offset, available: Offset, source: NestedScrollSource): Offset {
                Timber.i("NestedScrollConnection onPostScroll($consumed: Offset, $available: Offset, $source: NestedScrollSource)")
                if (available.y > 0.0 && consumed.y == 0.0f) {
                    //scolling down up but we're already at the top - kick over to sheet scrolling
                    listener.allowSheetDrag(true)
                }
                return super.onPostScroll(consumed, available, source)
            }
        }
    }
    Box(
        modifier = Modifier
            .fillMaxSize()
            .nestedScroll(nestedScrollConnection)
    ) {
        LazyColumn(
            modifier =
            Modifier
                .fillMaxSize()
                .padding(vertical = 12.dp), state = listState
        ) {
            item {
                Row() {}
            }
        }
    }
}

然后在片段中:

override fun allowSheetDrag(allowSheetDrag: Boolean) {
    bottomSheetFragment?.bottomSheetBehavior?.isDraggable = allowSheetDrag
}

共有2个答案

韩阳飙
2023-03-14

不幸的是,XML和Compose之间的可滚动性互操作性并不好。View上有一个方法叫做isNestedScrollingEnabled(),Compose总是返回false,所以嵌套滚动有不可预知的行为(我相信你在这里描述的就是这种行为)。

我发现的解决方法是确保对于可以滚动到大于全屏的内容,您将BottomSheet放在BottomSheetScaffold或其他自定义可组合视图中。就目前而言,您可能需要将整个体验转换为Compe,然后才能以我们期望的方式工作。

创作也是不断发展的。这些评论对于Compose 1.0.4和Material Design library 1.3.0来说是准确的-将来可能会发生变化。

广瑞
2023-03-14

巫师克里斯·班斯最近发布了一个解决方案,我可以证实它是有效的:https://gist.github.com/chrisbanes/053189c31302269656c1979edf418310

当在BottomSheetDialog中使用时,它也可以很好地过渡而无需抬起手指(向上滚动,然后一次性向下拖动工作表)

示例用法(取自Chris Banes的示例):

setContent {
    Surface(
        // Add this somewhere near the top of your layout, above any scrolling layouts
        modifier = Modifier.nestedScroll(rememberViewInteropNestedScrollConnection())
    ) {
        LazyColumn() {
            // blah
        }
    }
}

有一个问题正在跟踪嵌套滚动与ComposeViews:https://issuetracker.google.com/issues/174348612,和一个相关的SO问题,这导致我有: AndroidView在撰写丢失触摸事件在NestedScrollView

 类似资料:
  • 在我的主页上,我有一个懒散的专栏,其中一个项目是水平寻呼机。在每个水平寻呼机中都有一些页面,我也需要在其中设置懒散栏。错误是不允许在同一方向上使用嵌套滚动。我应该如何实现这个ui?

  • 问题内容: 基本上我需要做的是 我尝试做明显的 但这最终会引发异常 即使在互操作文档中为访问静态字段指定的表示法也会产生相同的异常 问题答案: 您可以使用$访问内部类 请注意,如果要导入,也应该导入。

  • 问题内容: 我们公司有一个基于Python的网站和一些基于Python的工作程序节点,它们通过Django / Celery和RabbitMQ进行通信。我有一个基于Java的应用程序,需要将任务提交给基于Celery的工作人员。我可以将作业从Java发送到RabbitMQ很好,但是基于Celery的工作人员从来没有接过工作。从查看两种类型的作业提交的数据包捕获来看,存在差异,但是我无法理解如何解释

  • 我的应用程序中的CoordinatorLayout中的平滑滚动有问题。 我试图做到这一点:http://wstaw.org/m/2015/10/02/google-scroll.gif 但我最好的结果是:http://wstaw.org/m/2015/10/02/my-scroll.gif 我做错了什么?提前感谢。

  • 在外出地点可经由互联网连接自己家中的PS3™。即使是远离自己家中的场所、或是海外皆可进行遥控操作。 A ) PS3™ 有线或无线连接互联网 B ) ADSL调制解调器、缆线调制解调器、光纤终端设备(ONU)等 C ) 互联网连接 D ) 接入点或无线路由器 E ) 以Wi-Fi连接 F ) 以移动网络连接 经由互联网进行遥控操作时,可能会因您使用的网络设备而出现无法操作的现象。详细请参阅PS3™用

  • 有什么方法可以添加滚动条以添加(已弃用)。Javadoc没有提到任何关于Jetpack撰写中的滚动条的内容。 在Jetpack Compose中有可能做到吗?还是不支持滚动条?