【发布时间】:2014-07-01 08:23:51
【问题描述】:
我有一个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;
}
}
}
}
在上面的代码中,displayArticle(WebView wv)函数中的wv.loadDataWithBaseURL在第一个请求中调用MyWebViewClient类中的回调函数,但是当请求完成并调用onPageFinished时,@987654330 @call 不会调用来自MyWebViewClient 的另一组回调。我不太清楚为什么,因为它必须与我最初使用的 WebView 相同,并且它应该具有相同的 MyWebViewClient 实例集。
此外,我使用相同的WebView 进行了其他loadUrl 调用,并且这种行为仍然存在。
如果有人能解释为什么会发生这种情况,我将不胜感激。
【问题讨论】:
标签: javascript android webview android-webview webviewclient