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:
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>
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>
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">
Android:layout_gravity="fill_vertical"
hat auch für mich gearbeitet.
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'
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;