it-swarm.com.de

NestedScrollView und CoordinatorLayout. Problem beim Scrollen

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

Wenn ich einen Inhalt verwende, der kleiner als NestedScrollView ist, sollte ich einen festen Inhalt haben. Wenn ich jedoch versuche, den Inhalt nach oben und unten zu scrollen, kann ich feststellen, dass der Inhalt verschoben ist und nie wieder an seiner Stelle steht.

Hier ein kleines Beispiel:enter image description here

Hier der 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>
34

Dies kann auch in der Käsequadrat Demo beobachtet werden, wenn alle bis auf eine Karte im Detailfragment entfernt werden.

Ich konnte dies (vorerst) mit dieser Klasse lösen: 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>
37
Paul Burke

Ich denke, dass es kein Fehler in der Support-Bibliothek ist, benutze einfach diese

<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">
36
LiFei

Android:layout_gravity="fill_vertical" hat auch für mich gearbeitet.

4
Ugo

Ich könnte mit meiner Antwort zu spät kommen, aber jetzt geht es los. Ich hatte ein ähnliches Problem, aber keine der oben genannten Lösungen hat für mich funktioniert. 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'
3
Aleks Nine

Die onMeasureChild () -Methode wird während des Layoutvorgangs mehrmals aufgerufen. Anscheinend erhält der Schlüssel zu Beginn des Prozesses einen Wert ungleich Null für die Kindergröße. ScrollingViewBehavior schlägt in den folgenden Fällen fehl:

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

FixedScrollingviewBehavior behebt dies mit:

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

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

Eine dem Original nahe stehende Alternative ist:

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