BackdropScaffold
,其中我的前层是我正在集成的 xml 布局。
主要问题是,当前层处于活动状态而后层隐藏时,滚动行为无法正确传播到前层,因此前层不可滚动(只有几次有效)
我尝试遵循以下文档,包含子 AndroidView 的父可组合项,但仍然无法正常工作。
这里是代码:
BackdropScaffold(
modifier = Modifier.fillMaxSize(),
appBar = { AnyAppBar() },
scaffoldState = rememberBackdropScaffoldState(BackdropValue.Revealed),
backLayerContent = {
Spacer(modifier = Modifier.height(8.dp))
LazyRow(
horizontalArrangement = Arrangement.spacedBy(8.dp),
contentPadding = PaddingValues(horizontal = 16.dp),
) {
items(cards) { card ->
AnyCardItem(card = card)
}
}
Spacer(modifier = Modifier.height(24.dp))
},
frontLayerContent = content,
)
content
是一个@Composable () -> Unit
,如下:
fun listComposable(): @Composable () -> Unit {
return {
val containerId by rememberSaveable { mutableStateOf(View.generateViewId()) }
val container = remember { mutableStateOf<FragmentContainerView?>(null) }
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { context ->
FragmentContainerView(context)
.apply { id = containerId }
.also {
fragmentManager.commit { add(it.id, AnyFragment.newInstance()) }
container.value = it
}
},
)
}
}
在上面的代码中,我只是将需要集成到
BackdropScaffold
中的片段转换为可组合的
最后使用以下布局创建片段:
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:layout_behavior="es.lidlplus.common.FixedAppBarLayoutBehavior"
>
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar_layout"
style="@style/AppBar.CollapsingLayout"
android:layout_width="match_parent"
android:layout_height="108dp"
app:collapsedTitleGravity="start"
app:expandedTitleMarginStart="14dp"
app:expandedTitleMarginTop="0dp"
app:toolbarId="@+id/toolbar"
>
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/white"
app:layout_collapseMode="pin"
/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/activated_count_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginStart="18dp"
android:layout_marginVertical="10dp"
/>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:orientation="vertical"
android:paddingBottom="75dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
它是一个
CoordinatorLayout
,包含一个 CollapsingToolbarLayout
和一个 RecyclerView
。一切都正确显示,但一旦前层处于活动状态,回收器视图就不会滚动。
我尝试设置
ViewCompat.setNestedScrollingEnabled(view, true)
并且 BackdropScaffold
内部使用 nestedScroll
状态,但增量仍然没有传播到片段。
有什么想法吗?
谢谢您的帮助。
也许用另一种方式来实现这个问题会更好。
这是自定义背景支架:
@Composable
fun CustomBackdropScaffold(
modifier: Modifier = Modifier,
appBar: @Composable () -> Unit,
backLayerContent: @Composable () -> Unit,
frontLayerContent: @Composable () -> Unit,
isRevealed: Boolean,
) {
Surface(modifier = modifier) {
Column {
appBar()
AnimatedVisibility(
visible = isRevealed,
enter = expandVertically(
expandFrom = Alignment.Top,
),
exit = shrinkVertically(
shrinkTowards = Alignment.Top,
),
) {
backLayerContent()
}
frontLayerContent()
}
}
}
这个实现对我来说很有效,就像你的问题一样