2011-07-21 78 views
3

我有一個本地網站,是可控的Javascript和我加載它在網頁視圖。該網站實際上是一個帶有iframe的主頁,其內容根據用戶輸入而改變。在主頁面上有一個「Next」按鈕,它運行一些javascript函數並決定在iframe中加載哪個頁面(通過document.getElement(...)。src =)Android的web視圖shouldOverrideUrlLoading爲I幀

在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的代碼,將該網址設置爲iframe的src,但沒有奏效。

這很奇怪,這只是發生在2.2手機上。在2.2模擬器中,它工作正常。

任何想法?

回答

5

嘗試向WebView提供您自己的WebViewClient。您應該覆蓋shouldOverrideUrlLoading(..)並返回false

+0

謝謝,這樣做! – Victor

+0

如何檢測它是否是子框架元素的主框架元素? – 4ntoine

1

我相信shouldOverrideUrlLoading只會被初始頁面URL調用 - 而不是iFrames。簽出onPageFinished(也在WebViewClient中)。這通常會針對每個iFrame調用,儘管我已經看到Android 2.1和2.2之間的行爲差​​異。

請注意,onPageFinished返回void,因此無法告訴WebView不要繪製框架 - 無論如何它應該已經繪製了該點。但是你可以隨時監控網址onPageFinished,那麼當你看到感興趣的URL,隱藏的WebView(您可能需要切換到另一個視圖),然後開始新的活動。

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

不適用於最新版本 – Sindre

6

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

     }