繁体   English   中英

WebViewClient第二次未调用

[英]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.loadDataWithBaseURLdisplayArticle(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM