SwipeRefreshLayout + WebView, wenn die Bildlaufposition oben ist

Ich versuche SwipeRefreshLayout mit WebView zu verwenden.

Ich bin vor dem Problem, wo in der Mitte der Seite, wenn Benutzer scrollt nach unten, unerwünschte Auffrischung tritt in.

  • Wie man eine Methode in MainActivity von einer anderen Klasse aufruft?
  • Eclipse erkennt das gleiche Gerät mehrmals
  • Android Studio: Rendering-Probleme Fehlende Styles-korrektes Thema für dieses Layout ausgewählt, Fehler beim Finden von Stil mit ID
  • Kann nicht finden Manifest.permission.WRITE_EXTERNAL_STORAGE auf v23
  • Proguard fehlt fehlende Zeilennummern
  • Android Unbekannt Command 'Crunch'
  • Wie mache ich das Refresh-Event nur, wenn die Scroll-Position von webview an der Spitze ist. (Dh er schaut auf den oberen Teil der Seite)?

  • Kann die Aktivität nicht starten: Nicht unterstütztOperationException: addView (View, LayoutParams) wird in AdapterView nicht unterstützt
  • Decodierung von Audiodateien und Re-Encoding auf das gewünschte PCM-Format: 44.100 kHz, 2 Kanäle, 16 Bit
  • Mehrere Zeilen Radio-Tasten in Android?
  • WebView Crash von java.io.IOException: close failed: EIO (I / O-Fehler) libcore.io.IoUtils.close (IoUtils.java:41)
  • Phonegap Cordova - Schwarzer Statusleiste unten unten nach Vollbild
  • Warum ist die Singleton-Klasse überlebt.
  • 8 Solutions collect form web for “SwipeRefreshLayout + WebView, wenn die Bildlaufposition oben ist”

    Ich habe es geschafft, es zu lösen, ohne etwas zu verlängern. Schau dir diesen Schnipsel an (Fragmentspezifisch):

    private ViewTreeObserver.OnScrollChangedListener mOnScrollChangedListener; @Override public void onStart() { super.onStart(); swipeLayout.getViewTreeObserver().addOnScrollChangedListener(mOnScrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { if (mWebView.getScrollY() == 0) swipeLayout.setEnabled(true); else swipeLayout.setEnabled(false); } }); } @Override public void onStop() { swipeLayout.getViewTreeObserver().removeOnScrollChangedListener(mOnScrollChangedListener); super.onStop(); } 

    Für einen breiteren Kontext, schau dir meine Antwort auf Android an – SwipeRefreshLayout mit leerer Textansicht .

    Ich denke, die empfohlene Art, dies zu tun ist, um die SwipeRefreshLayout zu erweitern und überschreiben canChildScrollUp()https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html#canChildScrollUp ()

    So ist es in der Google IO 2014 Zeitplan app – https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/widget /MultiSwipeRefreshLayout.java#L76

    Das CustomSwipeRefreshLayout wird wahrscheinlich aussehen:

     public class CustomSwipeRefreshLayout extends SwipeRefreshLayout { private CanChildScrollUpCallback mCanChildScrollUpCallback; public interface CanChildScrollUpCallback { boolean canSwipeRefreshChildScrollUp(); } public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) { mCanChildScrollUpCallback = canChildScrollUpCallback; } @Override public boolean canChildScrollUp() { if (mCanChildScrollUpCallback != null) { return mCanChildScrollUpCallback.canSwipeRefreshChildScrollUp(); } return super.canChildScrollUp(); } } 

    Und in deiner Activity hat das WebView ,

     public class FooActivity implements CustomSwipeRefreshLayout.CanChildScrollUpCallback { private CustomSwipeRefreshLayout mRefreshLayout; private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { // after initialization mRefreshLayout.setCanChildScrollUpCallback(this); } @Override public boolean canSwipeRefreshChildScrollUp() { return mWebview.getScrollY() > 0; } } 

    ViewTreeObserver.OnScrollChangedListener einfach Ihr Fragment oder Activity mit ViewTreeObserver.OnScrollChangedListener dann setzen Sie Listener wie webview.getViewTreeObserver().addOnScrollChangedListener(this);

    In onScrollChanged() -Methode mögen dies

      @Override public void onScrollChanged() { if (webview.getScrollY() == 0) { swipeLayout.setEnabled(true); } else { swipeLayout.setEnabled(false); } } 

    Sie können dies durch die Erweiterung von SwipeRefreshLayout mit einem benutzerdefinierten SwipeRefreshLayout, das in der WebView und verwenden Sie die WebView, um die scrollY Position zu überprüfen.

    Hinweis: Dies funktioniert für das Scrollen der ganzen Seite, aber es funktioniert möglicherweise nicht mit verschachtelten Rollen. Auch wenn du ein horizontales Scrollen hast, kannst du auch die in dieser Antwort gefundene Logik hinzufügen: https://stackoverflow.com/a/24453194

     public class CustomSwipeToRefresh extends SwipeRefreshLayout { private final int yScrollBuffer = 5; private WebView mWebView; public CustomSwipeToRefresh(Context context, WebView webView) { super(context); mWebView = webView; } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (mWebView.getScrollY() > yScrollBuffer) return false; return super.onInterceptTouchEvent(event); } } 

    Ich war vor einer ähnlichen Frage, aber keiner der hier gegebenen Antworten funktioniert für mich. Also habe ich eine Lösung von dieser Antwort bekommen.

    Schritt 1 : Klasse erstellen CustomWebView

     public class CustomWebView extends WebView{ private OnScrollChangedCallback mOnScrollChangedCallback; public CustomWebView(final Context context) { super(context); } public CustomWebView(final Context context, final AttributeSet attrs) { super(context, attrs); } public CustomWebView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } @Override protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) { super.onScrollChanged(l, t, oldl, oldt); if(mOnScrollChangedCallback != null) mOnScrollChangedCallback.onScroll(l, t); } public OnScrollChangedCallback getOnScrollChangedCallback() { return mOnScrollChangedCallback; } public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback) { mOnScrollChangedCallback = onScrollChangedCallback; } /** * Impliment in the activity/fragment/view that you want to listen to the webview */ public static interface OnScrollChangedCallback { public void onScroll(int horizontal, int vertical); }} 

    Schritt 2 : In XML- Datei verwenden webview wie diese-

      <com.yourpackagename.CustomWebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"/> 

    Schritt 3 : In deiner MainActivity setOnScrollChangedCallback

      mWebView.setOnScrollChangedCallback(new CustomWebView.OnScrollChangedCallback(){ public void onScroll(int horizontal, int vertical){ System.out.println("=="+horizontal+"---"+vertical); //this is to check webview scroll behaviour if (vertical<50){ swipeRefreshLayout.setEnabled(true); }else{ swipeRefreshLayout.setEnabled(false); } } }); } 

    Die Antwort von hiBrianLee hat fast für mich gearbeitet, aber wie John Shelley schrieb, bekam getScrollY immer wieder 0 in meinem Fall (ich habe ein ListView als das verschachtelte Scroll-Kind). Was nun sofort gearbeitet hat, war es, canScrollVertically stattdessen zu verwenden (was eine View Methode ist, also sowohl für ListView s als auch für WebView und auch für jede andere Art von Scroll-Child).

    Meine Layout-Klasse sieht wie folgt aus:

     public class NestedScrollSwipeLayout extends SwipeRefreshLayout { private ListView scrollChild; public NestedScrollSwipeLayout(Context context) { super(context); } public NestedScrollSwipeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void setScrollChild(ListView child) { this.scrollChild = child; } @Override public boolean canChildScrollUp() { return (scrollChild != null && scrollChild.canScrollVertically(-1)) || super.canChildScrollUp(); } } 

    (Wie bereits erwähnt, ist canScrollVertically eine View Methode, so dass die ListView sicher durch eine allgemeine View oder eine andere spezialisierte View-Klasse ersetzt werden kann.)

    Ich finde eine Lösung dafür. Verwenden Sie einfach das CoordinatorLayout als das Root-Layout und fügen Sie layout_behavior = "@ string / appbar_scrolling_view_behavior" zu Ihrem SwipeRefreshLayout hinzu. Es ist perfekt für mich.

    Verwenden Sie SwipeRefreshLayout normal, wie Sie es mit anderen Ansichten tun, aber das verschachtelte Scrollen ermöglichen.

     swipeRefreshLayout.setNestedScrollingEnabled(true); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.