たぼさんの部屋

いちょぼとのんびり

T017) WebView Javascript: 文字列の数式をevalで計算

  • 文字列にした問題の答えを出力するためにjavascirptでevalする

f:id:donsuka_kk:20121123001258p:plain

Main.java

package com.example.t017_wevview_javascript;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.LinearLayout;
/*
 * 忘備録
 * 1)manifest.xml permission追記:android.permission.INTERNET
 * 2)assetsにファイルを配置:eval.htmlというファイル名
 * 3)内容は以下
 * ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
<script type="text/javascript">
  function callEval(arg) {
    // Javaのメソッドを呼び出す
    window.android.getAnswerFromJS(eval(arg));
  }
</script>
 * ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥
 */
public class Main extends Activity {
	Button button;
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
     
       final WebView webView = new WebView(this);
       webView.getSettings().setJavaScriptEnabled(true);
       // JavaScriptにJavaオブジェクトを登録する
       // 第2引数で指定した名前で、Javascriptからオブジェクトにアクセスできます。
       webView.addJavascriptInterface(new JavascriptAdapter(), "android");
       webView.loadUrl("file:///android_asset/eval.html");
   
       button = new Button(this);
       setContentView(button, new LinearLayout.LayoutParams(200, 100));
       button.setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View v) {
               // Javascriptに渡す計算式
               String expression = "(1 + 5) * (3 + 4)";
               // Javascriptのeval関数を呼び出す
               webView.loadUrl("javascript:callEval('" + expression + "')");
           }
       });
   }
   
   private Handler mHandler = new Handler();
   
   class JavascriptAdapter {
       // Javascriptから呼び出されるメソッド
       public void getAnswerFromJS(final String answer) {
           mHandler.post(new Runnable() {
               public void run() {
                   // 計算結果をログ出力
                   Log.d("TAG", answer);
                   button.setText(answer);
               }
           });
       }
   }
}

eval.html (assets)

<script type="text/javascript">
  function callEval(arg) {
    // Javaのメソッドを呼び出す
    window.android.getAnswerFromJS(eval(arg));
  }
</script>