КоординаторLayout с CollapsingToolbarLayout прерывается с помощью клавиатуры в диалоговом фрагменте

Недавно я решил перенести свое приложение на использование новой библиотеки дизайна поддержки и недавно обнаружил очень неприятную ошибку.

Скажем, у меня есть CoordinatorLayout, где есть AppBarLayout и любой прокручиваемый вид, будь то ViewPager, NestedScrollView или даже RecyclerView с требуемым поведением прокрутки; Выбор отображения фрагмента диалога, который отображает клавиатуру, заставляет AppBarLayout отключиться от прокрутки, и они больше не прокручиваются.

Кроме того, представление прокрутки вынуждено изменять размер до половины экрана внизу, а макет AppBar занимает верхнюю половину, несмотря на то, что он не нужен.

Видео об ошибке здесь: Youtube Link

РЕДАКТИРОВАТЬ:

Проблема с настройкой softInputMode Клавиатуры в Activity для «adjustPan» устраняет проблему. По-видимому, координаторLayout не любит динамически изменять размер клавиатуры.

Оскорбительный XML выглядит так, но у меня есть несколько вариантов XML, которые демонстрируют это поведение, причем общим элементом среди них является использование CollapsingToolbarLayout:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="192dp" android:background="@color/transparent"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="144dp" android:elevation="4dp" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginBottom="@dimen/quadruple_margin" app:layout_collapseParallaxMultiplier="0.7" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true" android:background="@color/primary" android:orientation="vertical"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="bottom" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/ranking_background" /> <View android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:layout_gravity="bottom" android:background="@color/black_40" /> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/profile_picture" android:layout_width="@dimen/double_margin" android:layout_height="@dimen/double_margin" android:layout_alignBottom="@+id/text" android:layout_marginLeft="@dimen/double_margin" android:layout_marginStart="@dimen/double_margin" android:src="@drawable/image_placeholder" android:visibility="gone" /> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignWithParentIfMissing="true" android:layout_marginLeft="@dimen/single_margin" android:layout_marginStart="@dimen/single_margin" android:layout_marginTop="@dimen/quadruple_margin" android:layout_toRightOf="@+id/profile_picture" android:text="@string/my_places_for" android:textColor="@color/white" android:textSize="20sp" android:visibility="gone" /> <TextView android:id="@+id/sub_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/text" android:layout_marginLeft="@dimen/single_margin" android:layout_marginStart="@dimen/single_margin" android:layout_marginTop="@dimen/single_margin" android:text="@string/pick_category_or_business" android:textColor="@color/white" android:textSize="16sp" android:visibility="gone" /> </RelativeLayout> <android.support.v7.widget.Toolbar android:id="@+id/action_bar" android:layout_width="match_parent" android:layout_height="@dimen/abc_action_bar_default_height_material" app:contentInsetLeft="@dimen/triple_margin" app:contentInsetStart="@dimen/triple_margin" app:layout_collapseMode="pin" app:popupTheme="@style/Theme.AppCompat.NoActionBar" app:theme="@style/Theme.AppCompat.NoActionBar" /> </android.support.design.widget.CollapsingToolbarLayout> <android.support.design.widget.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/primary" app:layout_scrollFlags="scroll"> <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="48dp" android:layout_alignParentBottom="true" android:background="@color/primary" android:elevation="4dp" app:layout_scrollFlags="enterAlways" app:tabGravity="fill" app:tabMode="fixed" app:tabSelectedTextColor="@color/white" app:tabTextColor="@color/grey_400" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> 

Solutions Collecting From Web of "КоординаторLayout с CollapsingToolbarLayout прерывается с помощью клавиатуры в диалоговом фрагменте"

Ответ, предоставленный Tunji_D, решит проблему, но не обязательно является основной проблемой.

Поведение прокрутки на макете координатора имеет проблему прямо сейчас во время шага недействительности на его дочерних представлениях: https://code.google.com/p/android/issues/detail?id=176373#c5

Поэтому, чтобы исправить это, используйте это обходное решение, предоставленное junya, и установите поведение вашего представления с помощью

 app:layout_behavior="com.app.common.PatchedScrollingViewBehavior" 

И использовать:

 public class PatchedScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior { public PatchedScrollingViewBehavior() { super(); } public PatchedScrollingViewBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onMeasureChild(CoordinatorLayout parent, View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { if(child.getLayoutParams().height == -1) { List dependencies = parent.getDependencies(child); if(dependencies.isEmpty()) { return false; } AppBarLayout appBar = findFirstAppBarLayout(dependencies); if(appBar != null && ViewCompat.isLaidOut(appBar)) { if(ViewCompat.getFitsSystemWindows(appBar)) { ViewCompat.setFitsSystemWindows(child, true); } int scrollRange = appBar.getTotalScrollRange(); // int height = parent.getHeight() - appBar.getMeasuredHeight() + scrollRange; int parentHeight = View.MeasureSpec.getSize(parentHeightMeasureSpec); int height = parentHeight - appBar.getMeasuredHeight() + scrollRange; int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST); parent.onMeasureChild(child, parentWidthMeasureSpec, widthUsed, heightMeasureSpec, heightUsed); return true; } } return false; } private static AppBarLayout findFirstAppBarLayout(List<View> views) { int i = 0; for(int z = views.size(); i < z; ++i) { View view = (View)views.get(i); if(view instanceof AppBarLayout) { return (AppBarLayout)view; } } return null; } } 

Перейдите в манифест Android и измените «Режим мягкого ввода окна» на:

 android:windowSoftInputMode="adjustPan|adjustNothing" 

Попробуйте обновить до последней версии com.android.support:appcompat – Работал для меня.