WebView getScrollY() 总是 returns 0
WebView getScrollY() always returns 0
我正在尝试使用 webview 的滚动位置来确定 SwipeRefreshLayout 是否应该能够刷新,除了一些网站,例如https://jobs.lever.co/memebox, getScrollY() 始终 returns 0。有没有办法确保我始终获得正确的滚动位置?
您链接的网站有一个固定的 header。我的猜测是页面本身不会滚动;它里面的一个容器。 WebView
无法检查页面上的每个可滚动容器,因此它看到 top-level 容器不滚动并假定整个内容都是固定的。
如果您只需要 pull-to-refresh,我建议您在 SwipeRefreshLayout
之外添加一个刷新按钮。
检查您的网页布局。 CSS 中的 position: relative;
可能是问题的根源。相对定位导致在 WebView 中滚动时出现问题。
也许您可以尝试将其添加到您的自定义 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();
}
}
当 scrolling.When 为 onTop()
时添加一个顶级侦听器回调使用 setEnabled(true)
用于 SwipeRefreshLayout,否则 setEnabled(false)
这有点老了,但这个问题仍然存在。对于任何想知道的人,我通过执行以下操作解决了这个问题。
在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);
}
}
现在可以 enable/disable 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);
}
}
});
}
});
我正在尝试使用 webview 的滚动位置来确定 SwipeRefreshLayout 是否应该能够刷新,除了一些网站,例如https://jobs.lever.co/memebox, getScrollY() 始终 returns 0。有没有办法确保我始终获得正确的滚动位置?
您链接的网站有一个固定的 header。我的猜测是页面本身不会滚动;它里面的一个容器。 WebView
无法检查页面上的每个可滚动容器,因此它看到 top-level 容器不滚动并假定整个内容都是固定的。
如果您只需要 pull-to-refresh,我建议您在 SwipeRefreshLayout
之外添加一个刷新按钮。
检查您的网页布局。 CSS 中的 position: relative;
可能是问题的根源。相对定位导致在 WebView 中滚动时出现问题。
也许您可以尝试将其添加到您的自定义 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();
}
}
当 scrolling.When 为 onTop()
时添加一个顶级侦听器回调使用 setEnabled(true)
用于 SwipeRefreshLayout,否则 setEnabled(false)
这有点老了,但这个问题仍然存在。对于任何想知道的人,我通过执行以下操作解决了这个问题。
在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);
}
}
现在可以 enable/disable 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);
}
}
});
}
});