32

Ho un problema strano con il CoordinatorLayout e la NestedScrollView (con il design libreria di supporto 22.2.0)NestedScrollView e CoordinatorLayout. Problema sul scorrimento

Utilizzando un contenuto minore di NestedScrollView dovrei avere un contenuto fisso. Tuttavia, cercando di scorrere su e giù per il contenuto, posso ottenere che il contenuto sia spostato e mai più al loro posto.

Ecco un piccolo esempio: enter image description here

Ecco il codice:

<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

qui è la soluzione migliore controllarlo .. http://stackoverflow.com/a/34947835/4395114 –

risposta

34

Questo può anche essere osservato nel cheesesquare demo durante la rimozione tutte tranne una scheda nel dettaglio frammento.

sono stato in grado di risolvere questo (per ora) utilizzando questa classe: 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

Attualmente la soluzione alternativa è una buona soluzione. Penso che sia sicuramente un bug nella lib di supporto. –

+2

Bella correzione. Tuttavia, quando il contenuto della scroll è più piccolo della pergamena stessa, lo scroll continua a rispondere e comprime la barra degli strumenti. Qualche idea su come disattivare semplicemente lo scroll e la compressione quando lo scroll non è necessario (per piccoli scenari di contenuto) – GuillermoMP

+0

@GuillermoMP Hai risolto il problema? Sto affrontando lo stesso problema. – Jerry

2

Il metodo onMeasureChild() viene chiamato molte volte durante il processo di layout. Apparentemente, la chiave sta ottenendo un valore diverso da zero per l'altezza del bambino all'inizio del processo. ScrollingViewBehavior non riesce a farlo nel seguente:

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

FixedScrollingviewBehavior risolve questo con:

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

che dà molto presto altezza il valore di -128, l'altezza della barra di app.

Un'alternativa, vicino a quello originale è:

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

penso che non è un bug nel lib supporto, basta usare questo

<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

Cosa ti fa pensare che questa soluzione funzioni? –

+0

Ho provato il lavoro sopra e funziona come un fascino. Provalo! – datienza

+0

In realtà, funziona! Almeno il 22.2.1. Per me non era necessario avere 'fillViewPort' però. – Pin

3

potrei essere in ritardo con la mia risposta ma qui va. Stavo avendo un problema simile, ma nessuna delle soluzioni sopra menzionate ha funzionato per me. Alla fine l'ho risolto usando la versione 23 della libreria di supporto.

... 
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

per interesse, passando a v23 di supporto lib ha rotto i miei build con sdk sostenendo che non stavo usando un tema Theme.AppCompat anche se lo sono. –

+0

Beh, ho anche avuto un problema con v23 con le librerie deprecate di Apache, ma questo è un problema per un'altra domanda. Una volta risolto, prova a vedere se è stato risolto. –

3

android:layout_gravity="fill_vertical" ha funzionato anche per me.

Problemi correlati