32

Ich habe ein seltsames Problem mit dem CoordinatorLayout und der NestedScrollView (mit dem Design Support-Bibliothek 22.2.0)NestedScrollView und CoordinatorLayout. Ausgabe auf Scrolling

Mit einem Gehalt kleiner als NestedScrollView ich sollte einen festen Inhalt haben. Allerdings versuchen, den Inhalt nach oben und unten zu scrollen, kann ich erhalten, dass der Inhalt verschoben wird und nie wieder an ihrem eigenen Ort.

Hier ein kleines Beispiel: enter image description here

Hier den Code:

<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

Hier ist beste Lösung überprüfen Sie es .. http://StackOverflow.com/A/34947835/4395114 –

Antwort

34

Dies auch in der cheesesquare Demo beobachtet werden kann, wenn alle bis auf einer Karte im Fragmente Details zu entfernen.

konnte ich dieses Problem zu lösen (bis jetzt) ​​mit dieser Klasse: 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

Derzeit ist die Problemumgehung eine gute Lösung. Ich denke, dass es definitiv ein Fehler in der Support-Bibliothek ist. –

+2

Schöne Lösung. Wenn der Bildlaufinhalt jedoch kleiner als der Bildlauf selbst ist, reagiert der Bildlauf trotzdem und die Symbolleiste wird minimiert. Irgendeine Idee, wie man den Scroll und den Kollaps einfach deaktiviert, wenn der Scroll überhaupt nicht benötigt wird (für kleine Content-Szenarien) – GuillermoMP

+0

@GuillermoMP Haben Sie es geschafft, das Problem zu beheben? Ich stehe vor demselben Problem. – Jerry

2

Die onMeasureChild() Methode viele Male während des Layout-Prozesses aufgerufen wird. Anscheinend erhält der Schlüssel früh im Prozess einen Wert ungleich Null für die Kindhöhe. ScrollingViewBehavior nicht so in der folgenden Funktionen ausführen:

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

FixedScrollingviewBehavior korrigiert diese Fehler mit:

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

, die sehr früh Höhe den Wert von -128, um die Höhe der App-Leiste gibt.

Eine Alternative, in der Nähe des Original:

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

Ich denke, dass es nicht um einen Fehler in der Unterstützung lib ist, benutzen Sie einfach dieses

<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

Was lässt Sie glauben, dass diese Lösung funktioniert? –

+0

Ich habe die Arbeit oben versucht und funktioniert wie ein Charme. Versuch es! – datienza

+0

Eigentlich funktioniert das! Zumindest am 22.2.1. Für mich war es nicht notwendig, 'fillViewPort' zu haben. – Pin

3

Ich könnte spät mit meiner Antwort sein aber hier geht es. Ich hatte ein ähnliches Problem, aber keine der oben genannten Lösungen funktionierte für mich. Am Ende habe ich es mit der Version 23 der Support-Bibliothek behoben.

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

für Interesse, Wechsel zu v23 von Support-lib brach meine Builds mit sdk behaupten, ich habe keine 'Theme.AppCompat' verwendet, obwohl ich bin. –

+0

Nun, ich hatte auch ein Problem mit v23 mit den veralteten Bibliotheken von Apache, aber das ist ein Problem für eine andere Frage. Sobald Sie das gelöst haben, versuchen Sie zu sehen, ob das behoben ist. –

3

android:layout_gravity="fill_vertical" arbeitete für mich auch.

Verwandte Themen