たぼさんの部屋

いちょぼとのんびり

T019) (T017をもとにして):Javascript:WebViewを分離

point

manifest.xml

permission追加しなくても動作している(デバッグ環境:USB+実機)では。


f:id:donsuka_kk:20121123190939p:plain

Main.java


package com.example.t019_javascriptinterface;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
 * 
 * @author kamogashiratsuyoshi
 * manifest.xml:android.permission.INTERNET
 */
public class Main extends Activity {

	Context context;
	LinearLayout base;
	public static TextView tv;
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	
	    context = getApplicationContext();
	    base = new LinearLayout(context);
	    setContentView(base);
	    base.setOrientation(LinearLayout.VERTICAL);
	    
	    final JsInterface  js = new JsInterface(context);
	    
	    tv = new TextView(context);
	    tv.setText("答え");
	    tv.setTextSize(40);
	    base.addView(tv);
	    
	    final EditText et = new EditText(context);
	    base.addView(et);

	    Button btn = new Button(context);
	    btn.setText("計算");
	    
	    base.addView(btn);
	    
	    //listener
	    btn.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Editable mondai = et.getText();
				js.getAnswer(mondai);
			}
	    });
	}

}

JsInterface.java

package com.example.t019_javascriptinterface;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.text.Editable;
import android.util.Log;
import android.webkit.WebView;

@SuppressLint("SetJavaScriptEnabled")
public class JsInterface extends WebView {
	public JsInterface(Context context) {
		super(context);
		// this = WebView
		this.getSettings().setJavaScriptEnabled(true);
		// JavaScriptにJavaオブジェクトを登録する
		// 第2引数で指定した名前で、Javascriptからオブジェクトにアクセスできます。
		this.addJavascriptInterface(new JavascriptAdapter(), "android");
		this.loadUrl("file:///android_asset/eval.html");
	}
	public void getAnswer(Editable mondai){		//EditTextからの入力値を引数にするため、Editable

		Log.v("JsInterface","getAnswer:mondai="+mondai);
		// Javascriptのeval関数を呼び出す
        this.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);
					Main.tv.setText(ans);
				}
				
			});
		}
	}

}

Eval.html

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