[英]WebViewClient not called the second time
我有一个WebView
,可用来在我的应用程序本地加载一些html
内容。 它首先加载内容,然后调用JavaScript
函数,然后将WebView
滚动到特定位置。
以下代码说明了如何执行此操作:
public class MyActivity extends Activity {
private WebView web1;
private int ID;
private MyWebViewClient webViewClient1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
// Get the ID of the law to be loaded.
ID = getIntent().getIntExtra("element_id", 1);
web1 = (WebView) findViewById(R.id.web1);
web1.getSettings().setJavaScriptEnabled(true);
// Initialize the webViewClients.
webViewClient1 = new MyWebViewClient(true);
web1.setWebViewClient(webViewClient1);
displayArticle(web1);
}
private void displayArticle (WebView wv) {
StringBuilder sb = new StringBuilder();
// Code to build the HTML String.
String finalHtml = sb.toString();
wv.loadDataWithBaseURL("file:///android_asset/html/", finalHtml, "text/html", "UTF-8", null);
}
private class MyWebViewClient extends WebViewClient {
String urlToLoad;
MyWebViewClient (boolean setUrlToLoad) {
if (setUrlToLoad) {
setUrlToLoad();
}
}
public void setUrlToLoad () {
this.urlToLoad = "javascript:(function () {" +
"var elem = document.getElementById('e"+ID+"');" +
"var x = 0;" +
"var y = 0;" +
"while (elem != null) {" +
"x += elem.offsetLeft;" +
"y += elem.offsetTop;" +
"elem = elem.offsetParent;" +
"}" +
"window.scrollTo(x, y);" +
"})()";
}
@Override
public void onPageStarted (WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d("Pages", "Page loading started");
}
@Override
public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
Log.d("Pages", "Webview content load error");
}
@Override
public void onPageFinished (WebView view, String url) {
super.onPageFinished(view, url);
Log.d("Pages", "Page loading finished");
if (urlToLoad != null) {
// Scroll to the position.
view.loadUrl(urlToLoad);
urlToLoad = null;
}
}
}
}
在上面的代码中,回调函数MyWebViewClient
类被称为用于使用所述第一请求wv.loadDataWithBaseURL
在displayArticle(WebView wv)
的功能,但是当请求完成和onPageFinished
被调用时, view.loadUrl(urlToLoad);
调用不会从MyWebViewClient
调用另一组回调。 我不确定为什么,因为它必须与我最初使用的WebView
相同,并且应该具有MyWebViewClient
集的相同实例。
而且,我使用相同的WebView
进行了其他loadUrl
调用,并且此行为仍然存在。
如果有人能解释为什么会发生,我将不胜感激。
loadUrl("javascript:...")
有点特殊情况:它在当前页面的上下文中评估JavaScript代码(就像<a href='javascript:...'>clicky</a>
那样)因此,您将不会获得onPageStarted
/ onPageFinished
回调。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.