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
.
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:
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 eineACTION_CANCEL
und Die Ereignisse ab diesem Zeitpunkt werden an die Eltern gesendetonTouchEvent()
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?
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.
Tags und Links android android-touch-event swiperefreshlayout android-nestedscrollview