- 2008-04-02 (水)
- Android
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 やらも修正する必要がありましたが本筋ではない部分なので割愛しました。
- Newer: 最高! コクーン歌舞伎 夏祭浪速鑑
- Older: ウノウさんの所へ遊びに行ってきた。
Comment:0
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マインドマップ開発ブログ