たぼさんの部屋

いちょぼとのんびり

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 + "')");  //処理
 }			
});

f:id:donsuka_kk:20121124012943p:plain

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>