2011-07-21 20 views
3

JavaScriptが制御されているWebサイトをWebViewにロードしています。ウェブサイトは実際にはユーザーの入力に基づいて内容が変化するiframeを持つ1つのメインページです。メインページには、いくつかのJavaScript関数を実行し、iframeに読み込むページを決定する「次へ」ボタンがあります(document.getElement(...)。src =)iframe用Android webView shouldOverrideUrlLoading

Android 2.1ではうまくいきました - シミュレートされ、電話で。 webviewはすべてのページを適切に読み込んでいました。 私は2.2の携帯電話でそれをテストし、次のページをクリックするたびに(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> 

インテントフィルタを定義しました。 urlはブラウザによってまだ読み込まれています。

shouldOverredeUrlLoadingの使用は、ロードされたリンクが内部フレームの1つであるためうまく動作しません。私はそのURLをiframeのsrcとして設定するjavascriptコードを読み込もうとしましたが、動作しませんでした。

これは2.2の電話機でのみ起こります。 2.2エミュレータでは正常に動作します。

アイデア?

答えて

5

WebViewに独自のWebViewClientを提供してください。 shouldOverrideUrlLoading(..)を無効にしてfalseを返す必要があります。

+0

ありがとうございました。 – Victor

+0

子フレーム要素のメインフレーム要素であるかどうかをどのように検出しますか? – 4ntoine

1

私はshouldOverrideUrlLoadingがiFramesではなく初期ページURLに対してのみ呼び出されると信じています。 on(WebViewClient内の)PageFinishedをチェックしてください。これはAndroid 2.1と2.2の動作の違いを見てきましたが、一般にiFrameごとに呼び出されます。

onPageFinishedはvoidを返します。したがって、WebViewにフレームを描画しないように指示する方法はありません。また、その時点で描画する必要があります。しかし、あなたはいつでもonPageFinishedのURLを監視し、興味のあるURLが見えたらWebViewを隠して(別のビューに切り替える必要があるかもしれない)、新しい活動を開始することができます。

1

上記のshouldOverideUrlLoadingメソッドをオーバーライドしても私もうまくいくことを確認してください...私はphonegapを使用していましたので、以下のようにphonegapのGapViewClientオブジェクトをオーバーライドする必要がありました。同じ基本コンセプト。

shouldOverrideUrlLoadingは、ページ全体が変更されるときにのみ呼び出されます。

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では、以下のように振る舞うように思われます。

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

     } 
関連する問題