前层包含子AndroidView的BackdropScaffold

问题描述 投票:0回答:1

我在撰写中使用

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
状态,但增量仍然没有传播到片段。

有什么想法吗?

谢谢您的帮助。

android kotlin android-layout android-jetpack-compose interop
1个回答
0
投票

也许用另一种方式来实现这个问题会更好。

这是自定义背景支架:

@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()
        }
    }
}

这个实现对我来说很有效,就像你的问题一样

© www.soinside.com 2019 - 2024. All rights reserved.