1

我的应用程序中有一个 webview,首先它加载 a.html,单击 a.html 内的按钮,然后加载 b.html,单击 b.html 内的按钮,然后将启动一个活动。简而言之,顺序是a.html->b.html->启动一个活动。我的 webView 扩展了 WebViewClient,并覆盖了它的方法如下。

private class WebViewHandler extends WebViewClient
    {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) 
        {
            Log.d("onPageStarted", "onPageStarted:" + url );
            mProgress.setVisibility(View.VISIBLE);
        }

        @Override
        public void onPageFinished(WebView view, String url) 
        {
            Log.d("onPageFinished", "onPageFinished:" + url );
            mProgress.setVisibility(View.GONE);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
        {
            Log.d("url", "onPageoverloaded the url: "+url);
            String tutorialId = url.substring(url.lastIndexOf("=") + 1);
            MetaioDebug.log("Tutorial Id detected: "+tutorialId);
            if (url.startsWith("metaio://"))
            {
                if (tutorialId != null)
                {
                    MetaioDebug.log("Native code tutorial to be loaded #"+tutorialId);
                    if (tutorialId.equals("1"))
                    {
                        Intent intent = new Intent(getApplicationContext(), Tutorial1.class);
                        startActivity(intent);
                    }

                return true;
            }
    }

问题是onPageStarted()它只在 a.html 开始加载时被调用,但在 b.html 开始加载时不会被调用。 shouldOverrideUrlLoading(WebView view, String url)仅当我单击 b.html 中的按钮而不是 a.html 中的按钮时才调用。

我很困惑什么时候应该调用这三种方法?

4

1 回答 1

0

我想onPageFinished()大概应该回归false

shouldOverrideUrlLoading () 的文档中

If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url.

不知道为什么它不起作用a.html,但它可能与您的返回值有关,因为系统将在某个时候确定它是否会自行处理前进的事情。

至于您的onPageStarted问题,我认为您正在看到预期的行为。onPageStarted() 的文档:

Notify the host application that a page has started loading. This method is called once for each main frame load so a page with iframes or framesets will call onPageStarted one time for the main frame. This also means that onPageStarted will not be called when the contents of an embedded frame changes, i.e. clicking a link whose target is an iframe.

我认为您的 WebView 认为自己处于“完成”状态,因为它已经完成了您已经要求它从 a.html 执行的原始渲染。

一种解决方法可能是使用 b.html 创建和扩展一个新的 WebView 以保证onPageFinished()被调用。我认为这取决于您如何将 b.html 加载到 webview 中。

您是否暗示您onPageFinished()在加载后看到调用b.html,而不是onPageStarted()?或者两者都没有被调用?

根据评论添加:

尝试b.html以另一种方式加载,以便 WebView 了解它正在加载一个全新的资源:

让其href当前值b.html指向一个 JavaScript 方法,该方法回调一个 JavaScript 接口对象,该对象在 Java 中调用类似这样的东西:

webview.loadURL("file:///b.html"); //or whatever the file location of b.html is.

我认为这会让您的 WebView 认为它正在加载新资源,因此同时调用onPageStarted()and onPageFinished()

于 2012-11-12T19:32:17.553 回答