【问题标题】:Android webView shouldOverrideUrlLoading for iframes用于 iframe 的 Android webView shouldOverrideUrlLoading
【发布时间】:2011-07-21 14:53:56
【问题描述】:

我有一个受 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 效果不佳,因为加载的链接是内部框架之一。我尝试加载将 url 设置为 iframe 的 src 的 javascript 代码,但没有成功。

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

有什么想法吗?

【问题讨论】:

    标签: android iframe webview


    【解决方案1】:

    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);
    
            }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如何检测它是否是子框架元素的主框架元素?
      【解决方案3】:

      只需确认覆盖 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;
              }
          });        
      }
      

      【讨论】:

        【解决方案4】:

        我相信 shouldOverrideUrlLoading 只会为初始页面 URL 调用,而不是 iFrames。查看 onPageFinished(也在 WebViewClient 中)。尽管我已经看到 Android 2.1 和 2.2 之间的行为差​​异,但通常每个 iFrame 都会调用它。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-16
          • 2019-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-03
          • 2013-08-27
          • 2011-10-07
          相关资源
          最近更新 更多