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 +
"/" + m + "/" + d + "')");このようにして、loadUrlでJavaScriptのshowDate関数を呼び出しています。後は、この関数内で、受け渡されたテキストをそのまま<p>タグに表示して作業完了、というわけです。ちょっとややこしいので、全体の処理の流れをよく追いながらコードを読んでみてください。
(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();
}
}
※関連コンテンツ