WebView で同じウィンドウにページをロードする

WebView を通常のブラウザとして使いたいと思って利用したときに、すぐに直感で期待した動作と異なる動きをすることに気づきます。

表示された HTML ページをクリックして、次のページへジャンプするとき、新しくブラウザが開いてしまうのです。

同じ WebView 内に次の新しいページのコンテンツをロードするにはどうしたらよいでしょうか。

WebView - 既定で新しいブラウザが開く

WebView を配置して http://www.google.com/ をロードします。そして、検索項目を入力して検索します。

Android WebView

試しに "webview" と入力して・・・

Android WebView

検索開始。

Android WebView

うまく検索できたようにみえますが、しかしよくみると、これは元のアプリケーションではなく、新しくブラウザが開いています。

もとのアプリケーションに画面を切り替えると、次のように元の検索開始前の状態のままです。

Android WebView

元々新しくブラウザを開いてよいのならば、わざわざ WebView を使うことはあまりないでしょう。ブラウザを新しく開くことなく、クリックしてナビゲートされた先も同じ WebView 内にロードさせたいものです。

なぜこのような動きになるのでしょうか。

WebView では新しく指定された URI を開くときに、WebViewClient が与えられていなければホストアプリケーションに処理を任せます。 ホストアプリケーションはアクティビティマネージャに処理を任せ、結果的にブラウザが開くことになります。

そこで、WebView の setWebViewClient メソッドで WebViewClient のインスタンスを作成します。

この WebViewClient オブジェクトでは新しく URL が指定された時に shouldOverrideUrlLoading が呼ばれます。 shouldOverrideUrlLoading で true を返すとホストアプリケーションに処理を任せ、false を返すとこの WebViewClient がそれを処理することを示します。

従って、WebViewClient の shouldOverrideUrlLoading で false を返せば、同じビュー内に次の画面が表示されることになります。

コード例は次の通りです。

package com.keicode.android.test;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebViewTest1Activity extends Activity {

  WebView webView;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
        
    webView = (WebView)findViewById(R.id.webView1);
    webView.setWebViewClient(new WebViewClient(){
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
      }
    });
    webView.loadUrl("http://www.google.com/");
  }
}

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門