Android webView shouldOverrideUrlLoading for iframes

时间:2011-07-21 14:53:56

标签: android iframe webview

我有一个受Javascript控制的本地网站,并将其加载到WebView中。该网站实际上是一个带有iframe的主页面,其内容根据用户输入而变化。主页面上有一个“下一步”按钮,用于运行一些javascript函数,并决定在iframe中加载哪个页面(通过document.getElement(...)。src =)

在Android 2.1中,一切都运行良好 - 模拟和手机。 webview正在正确加载所有页面。 我在2.2手机上测试了它,每当我点击Next,页面(应该加载到iframe中)都会在默认浏览器中加载。

我定义了一个意图过滤器

   <intent-filter>
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.DEFAULT" />
     <category android:name="android.intent.category.BROWSABLE" />
     <data
       android:scheme="file"
       android:host="*"
       android:pathPrefix="sdcard/Android/data/android.website/files/pages"
     />
    </intent-filter>

希望它将页面请求重定向到活动,但它不起作用。网址仍由浏览器加载。

使用shouldOverredeUrlLoading不能正常工作,因为加载的链接是内部框架之一。我尝试加载javascript代码,将该url设置为iframe的src,但不起作用。

奇怪的是,这只发生在2.2手机上。在2.2模拟器中它工作正常。

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

Android 4.x似乎表现如下:

仅当整个页面即将发生变化时才会调用

shouldOverrideUrlLoading

iframe只是网页的一部分。因此不会调用shouldOverrideUrlLoading

覆盖public WebResourceResponse shouldInterceptRequest(WebView view, String url)为我工作。

似乎没有正确的方法来阻止WebResourceResponse。您可以改为加载另一个URL:

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

            if( url.contains("myFancyUrl") ) {

                // Do something

                try {
                    return new WebResourceResponse("", "", new URL("http://myserver.com/myrootdocument.html").openStream());
                } catch(Exception exception) {
                    Log.e( exception.toString() );
                }

            }

            return super.shouldInterceptRequest(view, url);

        }

答案 1 :(得分:5)

尝试将自己的WebViewClient提供给WebView。您应该覆盖shouldOverrideUrlLoading(..)并返回false

答案 2 :(得分:1)

我认为只有onOverrideUrlLoading才会调用初始页面网址 - 而非iFrames。查看onPageFinished(也在WebViewClient中)。虽然我已经看到Android 2.1和2.2之间的行为存在差异,但通常会调用每个iFrame。

请注意,onPageFinished返回void,因此无法告诉WebView不绘制框架 - 并且无论如何它应该在那一点上绘制它。但是您可以随时监视onPageFinished中的URL,然后当您看到感兴趣的URL时,隐藏WebView(您可能需要切换到另一个视图),然后开始新的活动。

答案 3 :(得分:1)

刚刚确认覆盖shouldOverideUrlLoading方法(如上所述)也适用于我...我碰巧使用phonegap,所以我需要覆盖phonegap的GapViewClient对象,如下所示。但基本概念相同。

public class XXXX_Activity extends DroidGap {
/** Called when the activity is first created. 
 * @param view */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    super.loadUrl("file:///android_asset/www/RLO/index.htm");
    // Overide selected methods in  webview client used by phone gap to prevent
    // iframe replacements from taking over entire web page.
    super.appView.setWebViewClient(new DroidGap.GapViewClient(this) {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });        
}