Android WebViewClient';什么样的方法会被调用?

Android WebViewClient';什么样的方法会被调用?,android,webview,webviewclient,Android,Webview,Webviewclient,我的应用程序中有一个webview,首先加载a.html,单击a.html中的一个按钮,然后加载b.html,单击b.html中的一个按钮,然后启动一个活动。简而言之,顺序是a.html->b.html->开始一项活动。my webView扩展了WebViewClient,并覆盖其方法,如下所示 private class WebViewHandler extends WebViewClient { @Override public void onPage

我的应用程序中有一个webview,首先加载a.html,单击a.html中的一个按钮,然后加载b.html,单击b.html中的一个按钮,然后启动一个活动。简而言之,顺序是a.html->b.html->开始一项活动。my 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视图,字符串url)
仅在我单击b.html中的按钮时调用,而不是在a.html中调用


我很困惑这3个方法应该在什么时候被调用?

我认为
onPageFinished()
应该返回
false

从:

如果提供了WebViewClient,则返回true表示主机应用程序处理url,而返回false表示当前WebView处理url。

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

至于你的
onPageStarted
问题,我认为你看到了预期的行为

通知主机应用程序页面已开始加载。此方法对于每个主框架加载调用一次,因此带有iframe或frameset的页面将对主框架调用onpagestart一次。这也意味着,当嵌入帧的内容发生更改时,即单击目标为iframe的链接时,不会调用onPageStarted。

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

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

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

根据评论添加:

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

让当前值为
b.html
href
生成一个JavaScript方法,该方法调用Java中调用类似以下内容的JavaScript接口对象:

webview.loadURL(“file:///b.html"); //或者无论b.html的文件位置是什么。


我认为这会让您的Web视图认为它正在加载一个新资源,因此同时调用
onPageStarted()
onPageFinished()

来回答最后一个问题:是的,onPageFinished()在我加载b.html后调用,但在b.html开始加载时不调用onPageStarted()。顺序应该是onPageStarted()->onPageFinished(),但这里不是这样的。
onPageFinished()
没有与
onPageStarted()
相同的注释,它只被调用一次。对我来说,这意味着每次你(重新)加载资源时它都会被调用。不幸的是,我认为你看到了预期的行为。顺便问一下,你是如何加载
b.html
?它是否与a.html的方法相同?您所说的“onPageFinished()没有与onPageStarted()相同的注释”是什么意思??在a.html中,加载b.htmlSorry时有这样一行
,因为它很模糊。。。我的意思是在Android文档评论中。签出此url(无法使链接在评论中工作)。,java.lang.String)