Привязка верхнего содержимого к BottomSheet - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть FrameLayout (teaserContainer) и BottomSheet (invitesContainer). FrameLayout находится за пределами (и выше) BottomSheet. Я хочу, чтобы FrameLayout сокращался и следовал BottomSheet, поэтому FremeLayout разрушается при расширении BottomSheet.

Что происходит сейчас, так это то, что FrameLayout занимает всю страницу из-за ее android:layout_height="match_parent", но если я установлю ее на android:layout_height="wrap_content", она будет отображаться за BottomSheet и будет вертикально центрирована, как FAB.

Я хочу, чтобы при полном раскрытии BottomSheet (invitesContainer) FrameLayout (teaserContainer) занимал остальную часть экрана вплоть до панели инструментов.

Все примеры привязки представлений к BottomSheet включают в себя FAB, поэтому здесь мне не поможет.

<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".social.friends.FriendsListFragment">

    <FrameLayout
        android:id="@+id/teaserContainer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:fitsSystemWindows="true"
        android:gravity="center"
        android:orientation="vertical"
        android:visibility="gone"
        app:layout_anchor="@+id/invitesContainer"
        app:layout_anchorGravity="top">

        <com.myapp.android.common.social.friends.views.FriendsTeaser
            android:id="@+id/teaser"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            app:friendsTeaserState="EMPTY" />
    </FrameLayout>

    <LinearLayout
        android:id="@+id/invitesContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:clickable="true"
        android:focusable="true"
        android:orientation="vertical"
        app:behavior_hideable="true"
        app:behavior_peekHeight="0dp"
        app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:alpha="0.1"
            android:background="@color/body" />

        <com.myapp.android.common.social.friends.views.FriendsConnectItem
            android:id="@+id/connectFacebook"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:friendsConnectType="facebook" />

        <com.myapp.android.common.social.friends.views.FriendsConnectItem
            android:id="@+id/connectContacts"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:friendsConnectType="contacts" />

        <com.myapp.android.common.social.friends.views.FriendsConnectItem
            android:id="@+id/share"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:friendsConnectType="invite" />
    </LinearLayout>
</android.support.design.widget.CoordinatorLayout>

-------------------------------------------- -------------------------------------------------- ----------------

Решение: Это котлинская версия предложения Вадима

BottomSheetBehavior.from(invitesContainer).setBottomSheetCallback(object :
    BottomSheetBehavior.BottomSheetCallback() {
    override fun onStateChanged(bottomSheet: View, newState: Int) {
    }

    override fun onSlide(bottomSheet: View, slideOffset: Float) {
        val currentHeight = teaserContainer.height - bottomSheet.height
        val bottomSheetShiftDown = currentHeight - bottomSheet.top
        teaserContainer.setPadding(
            0,
            0,
            0,
            (bottomSheet.height + bottomSheetShiftDown)
        )
    }
})

1 Ответ

0 голосов
/ 08 ноября 2018

Мой пример похож на:

public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        int currentHeight = teaserContainer.getHeight() - bottomSheet.getHeight();
        int bottomSheetShiftDown = currentHeight - bottomSheet.getTop();
        rootContainer.setPadding(
                0,
                0,
                0,
                (mBottomSheet.getPeekHeight() + bottomSheetShiftDown));
            }

и mBottomSheet - BottomSheetBehavior mBottomSheet = BottomSheetBehavior.from(invitesContainer);

Так что это добавит / удалит заполнение вашего teaserContainer, когда вы опустите его.

...