WebView getScrollY()总是返回0

9

我正在尝试使用webview的滚动位置来确定SwipeRefreshLayout是否可以刷新,但是对于某些网站,例如https://jobs.lever.co/memebox,getScrollY()总是返回0。有没有办法确保我始终能获得正确的滚动位置?


可能是这个的重复问题:https://dev59.com/OXI95IYBdhLWcg3w1Bro - Sahil Nagpal
很不幸,我已经检查了那个链接,但它无法告诉我我所需要的信息。 - Tim Mutton
4个回答

5
也许您可以尝试将此添加到您的自定义 Webview 中,只需告诉它正在滚动即可。
 @Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            if(this.getScrollY() <= 0){
                this.scrollTo(0,1);
            }
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return super.onTouchEvent(event);
}

然后覆盖 onScrollChanged 方法

 @Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);;
    if (iWebViewScrollListener != null && t == 0) {
        iWebViewScrollListener .onTop();
    } else if (mIWebViewScroll != null && t != 0) {
        iWebViewScrollListener .notOnTop();
    }
}

在滚动时添加一个顶部监听回调。当调用onTop()时,为SwipeRefreshLayout使用setEnabled(true),否则使用setEnabled(false)


我知道我们被告知要避免使用“谢谢”这样的评论,但我无法控制自己...我花了很长时间才弄清楚这个问题,非常感谢你,伙计! - Tssomas

2
你提供的网站有一个固定的页眉。我的猜测是页面本身不滚动;它内部的一个容器滚动。 WebView无法检查页面上的每个可滚动容器,因此它看到顶级容器不滚动,并假定整个内容都是固定的。
如果你只需要下拉刷新,我建议在SwipeRefreshLayout之外添加一个刷新按钮。

0
检查您的网页布局。在您的CSS中,position: relative;可能是问题的根源。相对定位会导致WebView滚动出现问题。

0

这个问题有点老了,但仍然存在。对于任何想知道的人,我通过以下方式解决了这个问题。

GestureListener 中:

private class GestureListener extends GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

        if(distanceY>0) webView.scrollBy(0,1);
        else webView.scrollBy(0,-1);
    }
}

现在可以使用以下代码正确地启用/禁用swipeRefreshLayout

getScrollY

swipeLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        ViewTreeObserver observer = swipeLayout.getViewTreeObserver();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            observer.removeOnGlobalLayoutListener(this);
        } else {
            observer.removeGlobalOnLayoutListener(this);
        }
        observer.addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
            @Override
            public void onScrollChanged() {

                if (webView.getScrollY()==0) {
                    swipeLayout.setEnabled(true);
                } else {
                    swipeLayout.setEnabled(false);
                }
            }
        });
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接