【问题标题】:WebViewClient not called the second timeWebViewClient 未第二次调用
【发布时间】: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


    【解决方案1】:

    loadUrl("javascript:...") 是一种特殊情况:它在当前页面的上下文中评估 JavaScript 代码(就像 <a href='javascript:...'>clicky</a> 一样),因此您不会收到 onPageStarted/onPageFinished 回调。

    【讨论】:

    • 我明白了。那么我如何知道 webView 何时完成了对 JavaScript 代码的处理呢?这种情况没有回调吗?
    • 如果滚动知道它何时完成执行对您没有帮助,您需要覆盖 WebView.onScrollChanged(不要忘记从覆盖中调用 super.onScrollChanged)。
    猜你喜欢
    • 2012-12-03
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多