libro
www.tuyano.com
Google androidプログラミング入門

WebViewでインターネットアクセス! (6/6)

作成:2010-12-16 09:56
更新:2010-12-16 09:56

■Java側からWebページ内のJavaScriptを呼び出す

WebView内のWebページからJavaの処理を実行するのはこれでわかりました。では、今度は「Java側から、表示しているWebページ内のJavaScriptの処理を呼び出す」というのはどうやるのでしょか?

これは、WebViewの「loadUrl」を使います。これを呼び出して、JavaScriptのスクリプトをロードさせるのです。「そんなことしたら、今表示されているページが消えてしまう」と思うかも知れません。が、そうではないのです。
[WebView].loadUrl("javascript:実行する処理");
こんな形で呼び出すと、表示されているWebページそのものは変わらずに、指定したJavaScriptの処理だけをロードすることができます(ロードしたスクリプトはそのまま実行されます)。

これはちょっと実際のサンプルを動かしてみないとイメージがわかないかも知れません。下に、簡単な例をあげておきましょう。ここでは、WebViewを表示すると、JavaScriptのスクリプトからJavaのメソッドを呼び出し、そこで日付を選ぶダイアログを表示させてます。そしてダイアログを閉じると、今度はJavaのメソッドからJavaScriptのスクリプトをロードして実行し、Webページ内に結果の日付を表示します。

まずは、addJavascriptInterfaceJSObjを組み込みます。このクラスでは、日付ダイアログを呼び出すshowDlgが用意されています。日付ダイアログは、DatePickerDialogクラスとして用意されていますので、これをshowで表示しています。

ダイアログを閉じたときの処理は、OnDateSetListenerというメソッドでイベントリスナーを設定します。ここで、onDateSetというメソッドをオーバーライドすると、ダイアログを閉じたときにその処理が実行されます。ここでは、
web.loadUrl("javascript:showDate('" + y +
        "/" + m + "/" + d + "')");
このようにして、loadUrlでJavaScriptのshowDate関数を呼び出しています。後は、この関数内で、受け渡されたテキストをそのまま<p>タグに表示して作業完了、というわけです。

ちょっとややこしいので、全体の処理の流れをよく追いながらコードを読んでみてください。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package jp.tuyano.sample;

import java.util.Calendar;

import android.app.*;
import android.content.Context;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.*;

public class MySample extends Activity {
	public WebView webview01;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webview01 = (WebView)findViewById(R.id.WebView01);
        webview01.getSettings().setJavaScriptEnabled(true);
        webview01.addJavascriptInterface(new JSObj(this,webview01), "jsobj");
        String data = "<html><head><script type=\"text/javascript\">" +
        		"function init(){ jsobj.showDlg(); }" +
        		"function showDate(msg){document.getElementById('msg').innerHTML = msg;}" +
        		"</script></head><body onload=\"init()\">" +
        		"<h1>Sample</h1><p id=\"msg\">JavaScript test.</p></bod></html>";
        webview01.loadData(data,"text/html","utf8");
    }

}

class JSObj {
	private Context context;
	private WebView web;
	
	public JSObj(Context c,WebView w){
		context = c;
		web = w;
	}
	
	public void showDlg() {
		Calendar calendar = Calendar.getInstance();
        int y = calendar.get(Calendar.YEAR);
        int m = calendar.get(Calendar.MONTH);
        int d = calendar.get(Calendar.DAY_OF_MONTH);
		final DatePickerDialog dlg = new DatePickerDialog(
	            context,new DatePickerDialog.OnDateSetListener() {
	                @Override
	                public void onDateSet(DatePicker view,
	                		int y, int m, int d) {
	                    web.loadUrl("javascript:showDate('" + y +
	                    		"/" + m + "/" + d + "')");
	                }
	            },y,m,d);
	        dlg.show();
    }
}

※関連コンテンツ

「Google androidプログラミング入門」に戻る