Android - webview - shouldOverrideUrlLoading未调用 - 当用户点击iframe内的链接时

时间:2013-05-08 18:12:57

标签: android webview android-webview webviewclient

在我们的应用中,我们使用webview在视图中加载外部链接。使用loadurl方法加载链接并设置webview客户端以显示预加载器和webchrome客户端以监听webview的任何链接更改。

在webview中加载的网址。当链接加载时,有几个iframe,在其中我们有一个文本链接。点击链接,页面需要在默认浏览器中打开,而不是在webview本身内打开。

使用min-sdk / API level 8构建项目。以下是供参考的代码段。将附加的webview客户端和webchromeclient创建到webview,然后为其分配URL。

private class SomWebViewClient extends WebChromeClient{
    public void onProgressChanged (WebView view, int newProgress){
        if(newProgress == 100){

        }
    }
}
private class SomWebViewDefClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
    @Override
    public void onLoadResource (WebView view, String url){
        if(url.equalsIgnoreCase("http://google.com")){
            view.stopLoading(); 
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            view.canGoBack();
        }
    }
}

我尝试将WebViewClient添加到webview,并在shouldOverrideUrlLoading方法中识别URL更改。但这里没有捕获任何事件。有没有办法处理webview网址的iframe内的点击。

当我尝试在webview中打开不同的链接(没有任何iframe)时,能够跟踪在shouldOverrideUrlLoading内部触发的点击。但是当URL包含iframe并且当用户在webview中的任何链接上进行cliks时,无法跟踪shouldOverrideUrlLoading并在同一webview本身而不是新的浏览器窗口中打开。

当我搜索问题时,我无法找到确切的问题。如果有人遇到类似问题并找到解决方案,请分享。

如果还有其他需要,请告诉我。

先谢谢, 问候 Srinivasan.C

2 个答案:

答案 0 :(得分:1)

也许你打破了Same Origin Policy。看看this similar post

修改:有一种方法可以克服此安全策略,但您需要接受所面临的风险。在响应中,请确保您具有以下标题:“Access-Control-Allow-Origin:”

答案 1 :(得分:0)

如果您可以将属性target =“_ top”添加到您的链接,则会触发shouldOverrideUrlLoading()。 以下JavaScript代码执行此操作:

    public class MyFrame : Frame
    {
        public MyFrame()
        {
            Content = new Label() {
                Text = "Test"
            };
            BackgroundColor = Color.Transparent;
            OutlineColor = Color.Transparent;
        }
    }

[assembly: ExportRenderer (typeof (MyFrame), typeof (MyFrameRenderer))]
namespace YourAssembly.Droid
{
    public class MyFrameRenderer : FrameRenderer
    {
        public MyFrameRenderer()
        {

        }
    }
}