BottomSheet улетит с изменением видимости

У меня есть нижний лист с NestedScrollView внутри (см. Ниже). Когда я нажимаю кнопку FAB, я хочу сделать некоторые части в этом NestedScrollView невидимыми. Но когда я меняю некоторые линеаризованные видимости на GONE, нижняя часть листа пролегает сверху. Глянь сюда:

Введите описание изображения здесь

Вы можете получить весь код из https://github.com/Tanrikut/BottomSheetExample

Мой метод изменения видимости:

private void changeVisibility() { subtitleLayout.setVisibility(View.GONE); coordinateLayout.setVisibility(View.GONE); timeLayout.setVisibility(View.GONE); } 

Мой NestedScrollView xml:

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.NestedScrollView 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="wrap_content" app:behavior_peekHeight="120dp" app:layout_behavior="android.support.design.widget.BottomSheetBehavior" android:id="@+id/bottom_sheet_main"> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="28dp" android:background="@android:color/white" android:animateLayoutChanges="true" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingLeft="10dp" android:paddingStart="10dp" android:paddingTop="@dimen/activity_horizontal_margin"> <TextView style="@style/TextAppearance.AppCompat.Headline" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Dandelion Chocolate" android:id="@+id/title" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/activity_horizontal_margin" android:layout_marginTop="16dp" android:orientation="horizontal" android:id="@+id/subtitleLayout"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/subtitle" android:text="Subtitle" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="@dimen/activity_horizontal_margin" android:id="@+id/coordinateLayout"> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:alpha="0.36" android:src="@drawable/ic_room_24dp" android:background="@null" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/activity_horizontal_margin" android:layout_marginStart="@dimen/activity_horizontal_margin" android:text="740, Valencia St, San Francisco, CA" android:textColor="@android:color/primary_text_light" android:id="@+id/bottom_sheet_coordinate" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="@dimen/activity_horizontal_margin" android:id="@+id/timeLayout"> <ImageButton android:layout_width="24dp" android:layout_height="24dp" android:alpha="0.36" android:src="@drawable/ic_query_builder_24dp" android:background="@null" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/activity_horizontal_margin" android:layout_marginStart="@dimen/activity_horizontal_margin" android:text="Wed, 10 AM - 9 PM" android:textColor="@android:color/primary_text_light" android:id="@+id/bottom_sheet_time" /> </LinearLayout> </LinearLayout> </FrameLayout> </android.support.v4.widget.NestedScrollView> 

Я столкнулся с этим, потребовалось некоторое время, чтобы выяснить, в чем причина.

Это связано с тем, что вы используете android: animateLayoutChanges, на котором возникает ошибка в BottomSheetBehavior или CoordinatorLayout.

Удалите его, и BottomSheet прекратит анимацию самостоятельно, когда это не должно. Не исправление, но, по крайней мере, обходной путь.

Обновить:

Оказывается, если вы включите «animateLayoutChanges» программным путем, установив экземпляр LayoutTransition для использования, вы можете установить на нем флаг, который предотвратит его взаимодействие с представлениями, которые являются предками того, с которым вы используете андроид: animateLayoutChanges on (aka: Ваш контейнер BottomSheet):

 LayoutTransition transition = new LayoutTransition(); transition.setAnimateParentHierarchy(false); yourLinearLayoutThatNeedsLayoutAnimation.setLayoutTransition(transition); 

Может быть, это может вам помочь! Я не могу комментировать, поэтому отправляю его как ответ

Вот

Для слайд-макета – то же самое, что и нижний лист, но хорошо

BottomSheetBehavior есть свое поведение, благодаря которому вы можете получить соответствующий результат. Ниже приведены поведение нижнего белья.

STATE_DRAGGING , STATE_SETTLING , STATE_EXPANDED , STATE_COLLAPSED , STATE_HIDDEN .

Не используйте видимость любых макетов.

Используйте это поведение в своем коде как:

 fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int behaviorState = bottomSheetBehavior.getState(); if (behaviorState == BottomSheetBehavior.STATE_EXPANDED) { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } else { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); } } });