Ich habe ein einfaches CollapsingToolbarLayout erstellt und es funktioniert wie ein Zauber. Mein Problem ist, dass wenn ich versuche, eine Schleuderrolle in der verschachtelten Bildlaufansicht zu verwenden , diese einfach stoppt, wenn ich meinen Finger loslasse. Normales Scrollen funktioniert wie es sollte.
Mein Aktivitätscode ist unverändert => automatisch generierte leere Aktivität. (Ich habe gerade auf Neue leere Aktivität in Android Studio klicken geklickt und das XML noch bearbeitet).
Ich habe hier gelesen, dass Scroll-Gesten in der Bildansicht selbst fehlerhaft sind, aber nicht, dass das Scrollen selbst fehlerhaft ist: siehe hier .
Ich habe versucht, "Smooth Scrolling" durch Java-Code zu aktivieren . Wenn ich so weit scrolle, dass die Bildansicht nicht mehr sichtbar ist, werden Schleudergesten erkannt.
TLDR: Warum funktioniert die Fling-Geste nicht, solange die Bildansicht sichtbar ist? Mein XML-Code sieht folgendermaßen aus:
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/profile_app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/profile_collapsing_toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleMarginStart="48dp"
app:expandedTitleMarginEnd="64dp"
android:fitsSystemWindows="true">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="420dp"
android:scaleType="centerCrop"
android:fitsSystemWindows="true"
android:src="@drawable/headerbg"
android:maxHeight="192dp"
app:layout_collapseMode="parallax"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
app:layout_anchor="@id/profile_app_bar_layout"
app:layout_anchorGravity="bottom|right|end"
android:layout_height="@dimen/fab_size_normal"
android:layout_width="@dimen/fab_size_normal"
app:elevation="2dp"
app:pressedTranslationZ="12dp"
android:layout_marginRight="8dp"
android:layout_marginEnd="8dp"/>
<android.support.v4.widget.NestedScrollView
android:id="@+id/profile_content_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_gravity="fill_vertical"
android:minHeight="192dp"
android:overScrollMode="ifContentScrolls"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/LoremIpsum"/>
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
quelle
ACTION_DOWN y=98 -> ACTION_MOVE y=-40 -> ACTION_MOVE y=-33 -> ACTION_UP y=97
. Es sieht so aus, als würde sich das letzte Berührungsereignis fälschlicherweise als neben dem ersten melden.nestedScrollView.getParent().requestDisallowInterceptTouchEvent(true);
auf Ihre verschachtelteAntworten:
Ich hatte genau das gleiche Problem mit CollapsingToolbarLayout mit ImageView im Inneren und NestedScrollView . Die Schleuderrolle stoppt, wenn der Finger losgelassen wird.
Ich habe jedoch etwas Seltsames bemerkt. Wenn Sie mit dem Finger aus einer Ansicht mit OnClickListener (z. B. Button) mit dem Finger scrollen, funktioniert das Fling-Scrollen perfekt.
Also habe ich es mit einer seltsamen Lösung behoben. Setzen Sie OnClickListener (das tut nichts) für das direkte untergeordnete Element von NestedScrollView . Dann funktioniert es perfekt!
Geben Sie dem direkten Kind (LinearLayout) eine ID und setzen Sie OnClickListener in Activity
Anmerkungen:
Getestet mit der Support Design Library 25.0.1
CollapsingToolbarLayout mit scrollFlags = "scroll | enterAlwaysCollapsed"
quelle
Ich weiß, dass diese Frage vor über einem Jahr gestellt wurde, aber dieses Problem scheint in den Support- / Design-Bibliotheken immer noch nicht gelöst zu sein. Sie können dieses Problem markieren, damit es in der Prioritätswarteschlange weiter nach oben verschoben wird.
Trotzdem habe ich die meisten der veröffentlichten Lösungen dafür ausprobiert, einschließlich der von Patrick-IV, ohne Erfolg. Die einzige Möglichkeit, zur Arbeit zu kommen, bestand darin, den Fling nachzuahmen und ihn programmgesteuert aufzurufen, wenn bestimmte Bedingungen in erkannt wurden
onPreNestedScroll()
. In den wenigen Stunden meines Debuggens bemerkte ich, dass deronNestedFling()
nie nach oben (nach unten scrollen) aufgerufen wurde und vorzeitig verbraucht zu sein schien. Ich kann nicht mit 100% iger Sicherheit sagen, dass dies für 100% der Implementierungen funktioniert, aber es funktioniert gut genug für meine Zwecke, so dass ich mich damit zufrieden gegeben habe, obwohl es ziemlich hackig ist und definitiv nicht das, was ich tun wollte.Und wenden Sie es auf die AppBar an
CheeseSquare Demo: Vor Nach
quelle
enterAlways
layout_ScrollFlag entfernen, damit es funktioniert, aber jetzt gut funktioniertIch habe Floofers Lösung ausprobiert, aber sie war mir immer noch nicht gut genug. Also habe ich mir eine bessere Version seines Verhaltens ausgedacht. Das AppBarLayout wird jetzt erweitert und beim Schleudern reibungslos reduziert.
Hinweis: Ich habe Reflection verwendet, um mich hineinzuhacken, sodass es mit einer anderen Version der Android Design-Bibliothek als 25.0.0 möglicherweise nicht perfekt funktioniert.
Um es zu verwenden, legen Sie ein neues Verhalten für Ihr AppBarLayout fest.
quelle
Diese Antwort hat dieses Problem für mich gelöst. Erstellen Sie eine benutzerdefinierte
AppBarLayout.Behavior
wie folgt:und füge es dem folgenden hinzu
AppBarLayout
:quelle
Ich poste dies nur hier, damit andere es nicht in den Kommentaren verpassen. Die Antwort von Jinang funktioniert wunderbar, aber ein großes Lob an AntPachon für den Hinweis auf eine weitaus einfachere Methode. Anstatt eine
OnClick
MethodeChild of the NestedScrollView
programmgesteuert zu implementieren , ist es besser,clickable=true
die XML-Datei für das untergeordnete Element festzulegen.(Am selben Beispiel wie bei Jinang )
quelle
Im Code: https://android.googlesource.com/platform/frameworks/support/+/master/core-ui/java/android/support/v4/widget/NestedScrollView.java#834
Wenn ich einen Fling-Scroll in der NestedScrollView verwende, manchmal "mIsBeingDragged = false", löst NestedScrollView kein Fling-Ereignis aus.
Wenn ich die
if (mIsBeingDragged)
Anweisung lösche .Es wird kein Problem geben. Aber ich weiß nicht, welche anderen ernsthaften Probleme verursacht werden
quelle