• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:android htmlアプリ内のiframe)

Android HTMLアプリ内のiframeにおいて、デフォルトブラウザが立ち上がる事象の回避方法はあるでしょうか?

このQ&Aのポイント
  • ローカルhtmlをWebviewに読み込むAndroidアプリで、iframeに別のローカルhtmlを読み込む際に、一部の端末やバージョンにおいて、デフォルトブラウザが立ち上がり、「ファイルが無い」と表示される現象が発生しています。この現象を回避する方法はありますか?
  • 一部のAndroid端末やバージョンで、ローカルHTMLを読み込むAndroidアプリ内のiframeにおいて、デフォルトブラウザが立ち上がり、ファイルが存在しないと表示される問題が発生しています。この問題を解決する方法はありますか?
  • Androidアプリ内のiframeで別のローカルhtmlを読み込む場合に、一部の端末やバージョンでデフォルトブラウザが立ち上がり、「ファイルが無い」と表示される現象が起こっています。この問題の対策方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

WebViewClientを使わないと「どの機種でも期待通りの動作」をさせることはできないと思いますよ。 WebViewClientで、URLによって、自アプリで表示するのか、 別のブラウザで表示するのかを制御することができるはずですが、 WebViewClientを使いたくない理由がわかりません。

akirou
質問者

お礼

回答ありがとうございます。 アプリの動作としては「外部URLに飛ぶときは別のブラウザで開く」としたいのです。 WebViewに特に何も設定しなければ、外部URLは別のブラウザで開かれる状態になっています。 一方で今回の事象は、アプリが最初のローカルHTMLを読み込む時にさらにその中のIFRAMEのsrcをロードする際、OSが何か勘違いして外部ページを開こうとしてブラウザが立ち上がって来ているのではないかと考えています。 webView.setWebViewClient(new WebViewClient()); を使って全て自アプリ内で表示するようにすることは可能ですが、それでは上記のような期待した動作となりませんので、できることなら (1)setWebViewClient で自アプリ内で閉じ込める設定とする。 (2)アプリにローカルHTMLを読み込む。 (3)読み込みが終わったら、(1)の設定を解除して外部URLなどは別ブラウザで開くようにする。 というような流れで解消できないかな、と考えています。この場合ですと、(3)「(1)の設定を解除する」方法が分かりません。こちらの方法か、もしくは全く別の手段でもよいので期待の動作をさせる方法はないでしょうか? よろしくお願いします。

その他の回答 (2)

回答No.3

No.1です。 shouldOverrideUrlLoading()のメソッドの戻り値はどちらを指定しています? APIリファレンスで、このメソッドの戻り値に関して確認することをおすすめします。

回答No.2

No.1です。 webView.setWebViewClient(new WebViewClient());とするだけでは すべてWebView内のみで表示されるだけです。 iframeでうまくいくのか未確認ですが、 WebViewClient#shouldOverrideUrlLoading()をオーバライドして、 引数に指定されたURLがローカルか外部かを判定する方法ではダメなのでしょうか。

akirou
質問者

お礼

度々ありがとうございます。 あれから色々試行錯誤し、一応の解決を見ましたのでご報告と、よろしければ追加の質問をさせて下さい。 ご回答にあるように「WebViewClient#shouldOverrideUrlLoading()をオーバライドして」その中で外部URLの場合はインテントで標準ブラウザに飛ばすようにしてみたところ、ブラウザの起動自体はうまくいきました。 が、ブラウザを起動しつつも、元のWebViewでは引き続きページの遷移が行われるような状態になってしまいました(WebView上と標準ブラウザ上でそれぞれ遷移先のURLが表示されている状態)。 外部ブラウザに飛ばしたときはWebViewの動作を停止する、といった制御ができれば良かったのですが、その方法が分かりませんでした。ご存知でしたら後学のため教えて頂けないでしょうか? 結局今回は、setWebViewClientでWebView内に閉じ込め、ローカルHTMLのAタグ(リンク)はjavascriptでキャンセルしつつリンククリック時はjava側の処理を呼ぶようにし、その中で標準ブラウザを起動して外部URLを開くようにしました(ローカルHTML及びその中のIFRAMEはローカルパスなのでWebView内でロードされて問題ない)。これで質問に書いた不具合も出なくなりました。かなり強引な対応になってしまいましたが・・・ planet_9_9様の >WebViewClientで、URLによって、自アプリで表示するのか、 >別のブラウザで表示するのかを制御することができるはずですが、 この言葉が大変ヒントになりました、ありがとうございます。