WebView で同じウィンドウにページをロードする
WebView を通常のブラウザとして使いたいと思って利用したときに、すぐに直感で期待した動作と異なる動きをすることに気づきます。
表示された HTML ページをクリックして、次のページへジャンプするとき、新しくブラウザが開いてしまうのです。
同じ WebView 内に次の新しいページのコンテンツをロードするにはどうしたらよいでしょうか。
WebView - 既定で新しいブラウザが開く
WebView を配置して http://www.google.com/ をロードします。そして、検索項目を入力して検索します。
試しに "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/");
}
}