SwipeRefreshLayout fängt das MotionEvent von NestedScrollingChild nicht ab

8

Ich verwende ein NestedScrollWebView (stark beeinflusst durch den NestedScrollView ), die viele der bekannte Probleme , die mit der Verwendung verknüpft sind a WebView in CoordinatorLayout .

%Vor%

Das NestedScrollWebView funktioniert großartig mit den Scrollflags AppBarLayout und enterAlways|scroll|snap , aber nicht so gut mit SwipeRefreshLayout .

Ich habe die folgende Zeile aus dem NestedScrollWebView entfernt:

%Vor%

Dies stellt sicher, dass die Ansicht nicht über Bildlaufanzeigen angezeigt wird. Ich möchte, dass Scroll-Anzeigen angezeigt werden, aber die folgenden Umstände sollten auch bei aktivierter Überlauf-Funktion nicht auftreten.

Nach meinem Verständnis sollte SwipeRefreshLayout jedes Berührungsereignis abfangen, das dazu führt, dass der Aktualisierungsindikator gezogen wird (basierend auf seiner Implementierung von onInterceptTouchEvent() ). SwipeRefreshLayout verweigert auch requestDisallowInterceptTouchEvent() für alle untergeordneten Elemente, für die das verschachtelte Scrollen aktiviert ist. Das gilt für NestedScrollWebView . Daher sollten diese Ereignisse in der folgenden Vorgehensweise behandelt werden:

  

Wenn Sie von onInterceptTouchEvent() den Wert true zurückgeben, wird dies von der untergeordneten Ansicht angezeigt   war zuvor Umgang mit Touch-Events erhält eine ACTION_CANCEL und   Die Ereignisse ab diesem Zeitpunkt werden an die Eltern gesendet    onTouchEvent() Methode für die übliche Handhabung.

Stattdessen sehe ich, dass SwipeRefreshLayout die Berührungsereignisse von NestedScrollWebView ausspioniert, aber niemals sie abfängt. Dies wird durch die Tatsache belegt, dass NestedScrollWebView niemals ein ACTION_CANCEL Touch-Ereignis empfängt und weiterhin nachfolgende Ereignisse empfängt, obwohl der Indikator SwipeRefreshLayout nach unten gezogen wird.

Dies wird im folgenden Screenshot demonstriert; Dies zeigt den Indikator des SwipeRefreshLayout sowie den Überlauf-Indikator des WebView gleichzeitig an.

Ich kann nicht herausfinden, warum das der Fall sein würde. Wie bereits erwähnt, sollte SwipeRefreshLayout gut mit jeder Ansicht funktionieren, bei der das verschachtelte Scrollen aktiviert ist, aber aus irgendeinem Grund funktioniert es in diesem Fall nicht. Was könnte das Problem sein?

Aktualisieren

Ich denke, es hat etwas mit der Art und Weise zu tun, wie die NestedScrollWebView Methoden dispatchNestedPre... behandelt und dass sie immer die gesamte MotionEvent an die Methode super.onTouchEvent() übergibt. Laut Dokumentation :

  

Geschachtelte Pre-Scroll-Ereignisse sind für geschachtelte Scroll-Ereignisse, die berühren   Abfangen ist zu berühren. dispatchNestedPreScroll bietet eine Chance   für die übergeordnete Ansicht in einem verschachtelten Scroll-Vorgang zu verbrauchen oder   Alle Bildlaufvorgänge vor der untergeordneten Ansicht verbrauchen sie.

Jetzt muss ich herausfinden, wie ich NestedScrollWebView nacharbeiten kann, um diese Methoden richtig zu handhaben.

    
Bryan 18.08.2017, 16:44
quelle

0 Antworten