我想将我的网页浏览自动滚动到一个百分比,让我们说是页面的3/4,一开始。
问题:只有在webview完成渲染时才知道computeVerticalScrollRange。当webview完成渲染(不加载,但渲染所有内容)时,我不知道(并调查:我不知道?),当大小(computeVerticalScrollRange)完全是最终的时。
什么行不通:
当computeVerticalScrollRange仍然返回0时,将调用WebViewClient.onPageFinished。
当computeVerticalScrollRange仍然返回0时,将调用WebChromeClient.onProgressChanged 100%。
PictureListener.onNewPicture有时被称为太早,当computeVerticalScrollRange尚未最终时(小于之后的秒)。
编辑HTML,在调用Android类的window.onload上放置一个Javascript处理程序(使用警报)会遇到同样的问题:computeVerticalScrollRange有时候还不是最终的(小于之后的秒) )。
有没有办法从(滚动点)3/4的网页开始?
答案 0 :(得分:1)
如果computeVerticalScrollRange发生了变化,我实施了每隔600毫秒(第一个PictureListener.onNewPicture之后)检查的可怕的解决方案。如果此内容大小在过去600毫秒内没有变化,我假设网页完成加载,我进行滚动并在屏幕上显示webview(使其可见)。
可怕:这会使每页页面加载速度减慢600毫秒,即使对于只有几行的页面也是如此。
可怕:对于一个非常大的页面600毫秒可能还不够,我的应用程序仍然不会滚动。
我仍在寻找一个好的解决方案。
答案 1 :(得分:0)
我所做的是创建一个自定义WebView
,其中包含computeVerticalScrollRange()
的公开方法:
public int getVerticalScrollRange() {
return super.computeVerticalScrollRange();
}
之后在onPageFinished()
中调用此方法:
private void computeWebViewHeight() {
infoWebView.post(new Runnable() {
@Override
public void run() {
int webViewHeight = customWebView.getVerticalScrollRange();
// Also have a retryCount max so in case the webView really has a height of 0 you don't have an infinite loop
if(webViewHeight <= 0 && webViewHeightRetryCount < 10) {
webViewHeightRetryCount++;
computeWebViewHeight();
} else {
if(webViewHeightRetryCount >= 10) {
// RetryCount was above max, so execute fallback
} else {
// WebView has a height, do something with it
}
webViewHeightRetryCount = 0;
}
}
});
}
这样你就不会有600毫秒的延迟。
我已将retryCount设置为10,但可能有点低,我不太确定。