Home > Android > [Android] android.webkit.BrowserCallbackAdapter を m5 バージョンに対応させる

[Android] android.webkit.BrowserCallbackAdapter を m5 バージョンに対応させる

Android の SDK が m3 から m5 に変わり、API に大幅な変更が出ていますが、これまで使っていた、BrowserCallbackAdapter が使えなくなってしまったのでそれを変更するメモ。

まず、M5 の Changes Overview のページには、

BrowserCallback has been removed and the functionality has been separated with two new classes: android.webkit.WebViewClient and android.webkit.WebChromeClient.

とあるので、WebViewClient と、WebChromeClient の2つのクラスを使うように変更すればいいみたい。

そもそもやっていたことは、サーバ上の HTML を取得してきた時点で、その HTML の一部を書き換える処理。
BrowserCallback クラスを拡張したクラスを作って、そのクラスを WebView に setBrowserCallback で渡していました。

public class ContactView extends Activity {
	private WebView wv ; // WebView 
       (省略)
	/**
	 * callback Class for loading url
	 * @author hal
	 */
        public class MyCallback extends android.webkit.BrowserCallbackAdapter{
       (省略)
        public boolean overrideUrlLoading(String url){
    		this.myLoadUrl(url); // manual load
    		return false;
        }
        public void myLoadUrl(String url){
                // HttpClient クラスを使ってデータを取得して、書き換えて data 変数に格納する処理
                (省略)
                // WebView へ 表示
            	wv.loadDataWithBaseURL(url,data, "text/html", method.getResponseCharSet(),null);
        }
    }
    /**
     * initialize
     */
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.view_contact);
    	// WebKitのViewを取得        
        wv = (WebView) findViewById(R.id.web);
        // コールバック用クラスを設定
        cb = new MyCallback();
        wv.setBrowserCallback(cb); 
      	// JavaScript の利用を許可
        wv.getSettings().setJavaScriptEnabled(true);
        
    }
       (省略)
}
という処理ですね。

で、BrowserCallbackAdapter が使えなくなり、WebViewClient と WebChromeClient に分割され使いかたも変わっています。WebViewClient が、キーイベントと URL ロード関連のイベントリスナ、WebChromeClient が ウィンドウ関連のイベントリスナになっている模様。
WebViewClient の リファレンスを見ると、shouldOverrideUrlLoading というメソッドがあるので、それを使えばいいのかな。第一引数に WebView のインスタンスが渡ってくるようです。

今回の場合、 BrowserCallbackAdapter の代わりに WebViewClient を継承したクラスを、 WebView::setWebViewClient でセットしてあげれば良さそう。

というわけで、以下のように変更してみたところ無事動きました。

public class ContactView extends Activity {
       (省略)
	/**
	 * callback Class for loading url
	 * @author hal
	 */
        public class MyCallback extends android.webkit.WebViewClient{
       (省略)
    	/**
    	 * Handling method called when webkit loading url
    	 * @param wv WebView class instance
    	 * @param url loading url
    	 */
    	public boolean shouldOverrideUrlLoading(WebView wv,String url){
        	Log.d(TAG, "load start:" + url);
    		this.myLoadUrl(wv,url); // manual load
    		return false;
    	}
        public void myLoadUrl(String url){
                // HttpClient クラスを使ってデータを取得して、書き換えて data 変数に格納する処理
                (省略)
            	wv.loadDataWithBaseURL(url,data, "text/html", method.getResponseCharSet(),null);
        }
    }
    /**
     * initialize
     */
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.view_contact);
    	// WebKitのViewを取得
        
        wv = (WebView) findViewById(R.id.web);
        // コールバック用クラスを設定
        cb = new MyCallback();
        wv.setWebViewClient(cb);
      	// JavaScript の利用を許可
        wv.getSettings().setJavaScriptEnabled(true);
        
    }
       (省略)
}
実際には、バージョンアップに伴い AndroidManifest.xml やら layout 用の xml やらも修正する必要がありましたが本筋ではない部分なので割愛しました。

Comment:0

Comment Form
Remember personal info

Trackback:0

TrackBack URL for this entry
http://www.plants-web.jp/mt/mt-tb.cgi/241
Listed below are links to weblogs that reference
[Android] android.webkit.BrowserCallbackAdapter を m5 バージョンに対応させる from Flashマインドマップ開発ブログ

Home > Android > [Android] android.webkit.BrowserCallbackAdapter を m5 バージョンに対応させる

Search
Feeds

follow hal_sk at http://twitter.com

Page Top