T019(2): WebViewの読み込みが完了してから実行する
目的
文字列をjavascript eval()に渡して計算するときに
ボタンクリックイベントなら、webview読み込みしてから時間が経過しているので
問題なく動作していた--->T019
読み込みから時間をおかずに、scriptを実行する場合は
webviewの読み込みが完了してから処理を行うようにする。
point
onPageFinished(in WebViewClient)
wv.addJavascriptInterface(new JavascriptAdapter(), "android"); wv.loadUrl("file:///android_asset/eval.html"); //XXX WebViewの読み込み完了時に処理を実行するように wv.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { wv.loadUrl("javascript:callEval('" + mondai + "')"); //処理 } });
Main.java
package com.example.t019_2_javascriptinterface; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.LinearLayout; import android.widget.TextView; /** * * @author kamogashiratsuyoshi * manifest.xml:android.permission.INTERNET */ @SuppressLint("SetJavaScriptEnabled") public class Main extends Activity { Context context; LinearLayout base; TextView tv; WebView wv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); context = getApplicationContext(); base = new LinearLayout(context); setContentView(base); base.setOrientation(LinearLayout.VERTICAL); tv = new TextView(context); tv.setText("答え"); tv.setTextSize(40); base.addView(tv); wv = new WebView(context); wv.getSettings().setJavaScriptEnabled(true); // JavaScriptにJavaオブジェクトを登録する // 第2引数で指定した名前で、Javascriptからオブジェクトにアクセスできます。 wv.addJavascriptInterface(new JavascriptAdapter(), "android"); wv.loadUrl("file:///android_asset/eval.html"); final String mondai = "2+1"; //XXX WebViewの読み込み完了時に処理を実行するように wv.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { getAns(mondai); } }); } private void getAns(String mondai){ Log.v("JsInterface","getAnswer:mondai="+mondai); // Javascriptのeval関数を呼び出す wv.loadUrl("javascript:callEval('" + mondai + "')"); } Handler mHandler = new Handler(); class JavascriptAdapter { // Javascriptから呼び出されるメソッド public void getAnswerFromJS(final String ans){ mHandler.post(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub Log.v("ans",""+ans); tv.setText(ans); } }); } } }
Eval.html
<script type="text/javascript"> function callEval(arg) { // Javaのメソッドを呼び出す window.android.getAnswerFromJS(eval(arg)); } </script>