WebViewでインターネットアクセス! (6/6)
作成:2010-12-16 09:56
更新:2010-12-16 09:56
更新:2010-12-16 09:56
■Java側からWebページ内のJavaScriptを呼び出す
WebView内のWebページからJavaの処理を実行するのはこれでわかりました。では、今度は「Java側から、表示しているWebページ内のJavaScriptの処理を呼び出す」というのはどうやるのでしょか?
これは、WebViewの「loadUrl」を使います。これを呼び出して、JavaScriptのスクリプトをロードさせるのです。「そんなことしたら、今表示されているページが消えてしまう」と思うかも知れません。が、そうではないのです。
これはちょっと実際のサンプルを動かしてみないとイメージがわかないかも知れません。下に、簡単な例をあげておきましょう。ここでは、WebViewを表示すると、JavaScriptのスクリプトからJavaのメソッドを呼び出し、そこで日付を選ぶダイアログを表示させてます。そしてダイアログを閉じると、今度はJavaのメソッドからJavaScriptのスクリプトをロードして実行し、Webページ内に結果の日付を表示します。
まずは、addJavascriptInterfaceでJSObjを組み込みます。このクラスでは、日付ダイアログを呼び出すshowDlgが用意されています。日付ダイアログは、DatePickerDialogクラスとして用意されていますので、これをshowで表示しています。
ダイアログを閉じたときの処理は、OnDateSetListenerというメソッドでイベントリスナーを設定します。ここで、onDateSetというメソッドをオーバーライドすると、ダイアログを閉じたときにその処理が実行されます。ここでは、
ちょっとややこしいので、全体の処理の流れをよく追いながらコードを読んでみてください。
これは、WebViewの「loadUrl」を使います。これを呼び出して、JavaScriptのスクリプトをロードさせるのです。「そんなことしたら、今表示されているページが消えてしまう」と思うかも知れません。が、そうではないのです。
[WebView].loadUrl("javascript:実行する処理");こんな形で呼び出すと、表示されているWebページそのものは変わらずに、指定したJavaScriptの処理だけをロードすることができます(ロードしたスクリプトはそのまま実行されます)。
これはちょっと実際のサンプルを動かしてみないとイメージがわかないかも知れません。下に、簡単な例をあげておきましょう。ここでは、WebViewを表示すると、JavaScriptのスクリプトからJavaのメソッドを呼び出し、そこで日付を選ぶダイアログを表示させてます。そしてダイアログを閉じると、今度はJavaのメソッドからJavaScriptのスクリプトをロードして実行し、Webページ内に結果の日付を表示します。
まずは、addJavascriptInterfaceでJSObjを組み込みます。このクラスでは、日付ダイアログを呼び出すshowDlgが用意されています。日付ダイアログは、DatePickerDialogクラスとして用意されていますので、これをshowで表示しています。
ダイアログを閉じたときの処理は、OnDateSetListenerというメソッドでイベントリスナーを設定します。ここで、onDateSetというメソッドをオーバーライドすると、ダイアログを閉じたときにその処理が実行されます。ここでは、
web.loadUrl("javascript:showDate('" + y +このようにして、loadUrlでJavaScriptのshowDate関数を呼び出しています。後は、この関数内で、受け渡されたテキストをそのまま<p>タグに表示して作業完了、というわけです。
"/" + m + "/" + d + "')");
ちょっとややこしいので、全体の処理の流れをよく追いながらコードを読んでみてください。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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(); } }
※関連コンテンツ