32

У меня есть странный вопрос с CoordinatorLayout и NestedScrollView (с проектной поддержкой библиотекой 22.2.0)NestedScrollView и CoordinatorLayout. Выпуск на прокрутке

Используя содержание меньше, чем NestedScrollView я должен иметь фиксированное содержание. Однако, пытаясь прокрутить вверх и вниз содержимое, я могу получить, что содержимое перемещено и больше никогда не будет на своем месте.

Вот небольшой образец: enter image description here

Вот код:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
       app:layout_scrollFlags="scroll|enterAlways" /> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.NestedScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <FrameLayout 
      android:paddingTop="24dp" 
      android:id="@+id/fragment_container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:padding="@dimen/padding"> 

     </FrameLayout> 

    </android.support.v4.widget.NestedScrollView> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab_action" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="end|bottom" 
     android:layout_margin="16dp" 
     android:visibility="gone" 
     android:src="@drawable/ic_done" /> 

</android.support.design.widget.CoordinatorLayout> 
+0

вот лучшее решение проверить его .. http://stackoverflow.com/a/34947835/4395114 –

ответ

34

Это также можно наблюдать в cheesesquare демо при удалении всех, кроме одной карты в деталях фрагмента.

я был в состоянии решить эту проблему (на данный момент), используя этот класс: https://gist.github.com/EmmanuelVinas/c598292f43713c75d18e

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="com.evs.demo.layout.FixedScrollingViewBehavior"> 
    ..... 
</android.support.v4.widget.NestedScrollView> 
+2

В настоящее время обходное решение является хорошим решением. Я думаю, что это определенно ошибка в lib. –

+2

Хорошее исправление. Однако, когда содержание прокрутки меньше самого прокрутки, свиток по-прежнему отвечает и сворачивает панель инструментов. Любая идея, как просто отключить прокрутку и коллапс, когда прокрутка не требуется вообще (для небольших сценариев контента) – GuillermoMP

+0

@GuillermoMP Вам удалось это исправить? Я столкнулся с той же проблемой. – Jerry

2

Метод onMeasureChild() вызывается много раз в процессе компоновки. По-видимому, ключ получает ненулевое значение для высоты ребенка в начале процесса. ScrollingViewBehavior не в состоянии сделать это в следующем:

int scrollRange = appBar.getTotalScrollRange(); 
int height = parent.getHeight() 
      - appBar.getMeasuredHeight() 
      + scrollRange; 

FixedScrollingviewBehavior фиксирует это с:

int height = parent.getHeight() 
      - appBar.getMeasuredHeight() 
      + Math.min(scrollRange, parent.getHeight() - heightUsed); 

, который очень рано дает высоту значение -128, высоту панели приложения.

Альтернативой, близким к оригиналу является:

int height = parent.getMeasuredHeight() 
      - appBar.getMeasuredHeight() 
      + scrollRange; 
32

Я думаю, что это не ошибка в опорном Lib, просто использовать этот

<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="match_parent" 
    android:fillViewport="true" 
    android:layout_gravity="fill_vertical" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
+0

Что заставляет вас думать, что это решение работает? –

+0

Я пробовал работу выше и работает как шарм. Попробуй! – datienza

+0

Собственно, это действительно работает! По крайней мере, 22.2.1. Для меня не было необходимости иметь «fillViewPort». – Pin

3

Я мог бы быть поздно с моим ответом но здесь идет. У меня была аналогичная проблема, но ни один из вышеупомянутых решений не работал для меня. В конце концов я исправил его, используя версию 23 библиотеки поддержки.

... 
compileSdkVersion 23 
... 
targetSdkVersion 23 
... 
compile 'com.android.support:appcompat-v7:23.1.0' 
compile 'com.android.support:support-v4:23.1.0' 
compile 'com.android.support:design:23.1.0' 
+0

для интереса, переключение на v23 поддержки lib сломал мои сборки с sdk, утверждая, что я не использовал 'Theme.AppCompat', хотя я и есть. –

+0

У меня также была проблема с v23 с устаревшими библиотеками Apache, но это проблема для другого вопроса. Как только вы решите, попробуйте проверить, исправлено ли это. –

3

android:layout_gravity="fill_vertical" работал для меня тоже.

Смежные вопросы