Edited at

KitKat(android4.4/SDK19)以降のloadUrlでjavascript実行エラーになる件の修正方法

More than 3 years have passed since last update.


やりたいこと

WebView#loadUrlでhtmlを読んだ後、その内容に対してjavascriptを実行したい。

例)ある部分の文字列を置換したい、など。


4.3以下まで出来た記述

mWebView.setWebViewClient(new MyWebViewClient());

mWebView.loadUrl("file:///android_asset/index.html");

private class MyWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, final String url) {
mWebView.loadUrl("javascript:document.getElementById('sample').innerHTML = javascript changed");
}
}


4.4.xで実行するとエラー

I/chromium(30811): [INFO:CONSOLE(1)] "Uncaught TypeError: Cannot set property 'innerHTML' of null", source: 

おそらく、4.4以降WebViewの内部実装がchroniumに変わったため出るようになったぽい。


修正方法

SDK19以降で追加されたメソッドWebView#evaluateJavascriptを使う。

mWebView.evaluateJavascript("javascript:document.getElementById('sample').innerHTML = javascript changed", null);

第2引数にコールバックを登録すればJavascriptの実行結果が受け取れる。