1

最初にa.htmlをロードし、a.html内のボタンをクリックするとb.htmlがロードされ、b.html内のボタンをクリックするとアクティビティが開始されます。つまり、順番はa.html->b.html->starts an activityです。私の 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)a.htmlではなくb.htmlのボタンをクリックしたときにのみ呼び出されます。

これらの 3 つのメソッドをいつ呼び出す必要があるか、非常に混乱しています。

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から要求した元のレンダリングをすでに完了しているため、自分自身を「完了」状態にあると見なしていると思います。

回避策として、新しい WebView を作成して b.html で膨らませ、確実onPageFinished()に呼び出されるようにすることができます。b.html を webview にロードする方法に依存すると思います。

onPageFinished()あなたがロードした後に呼び出されているのを見ていることを暗示していますb.htmlonPageStarted()?それともどちらも呼び出されませんか?

コメントに基づいて追加:

b.htmlWebView がまったく新しいリソースをロードしていることを理解できるように、別の方法でロードしてみてください。

現在hrefの値がb.htmlJava で次のようなものを呼び出す JavaScript インターフェイス オブジェクトにコールバックする JavaScript メソッドにつながるようにします。

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

onPageStarted()これにより、WebView が新しいリソースを読み込んでいると見なされるため、 と の両方を呼び出すと思いますonPageFinished()

于 2012-11-12T19:32:17.553 に答える