WebViewでインターネットアクセス! (5/6)
作成:2010-12-16 09:13
更新:2010-12-16 09:13
更新:2010-12-16 09:13
■Web内からAndroidの機能を呼び出す
WebViewで、Webページとしてアプリの画面を作るというのは非常にいいアイデアですが、しかしHTMLを表示するだけでは、Androidらしい機能が使えません。この問題はどう解決すれば良いのでしょうか。
実をいえば、WebViewでは、JavaScript内からJavaの機能(つまり、アプリに用意したクラスのメソッドなど)を呼び出すことが出来る仕組みになっているのです。あらかじめ呼び出すクラスを定義しておき、WebViewに表示するHTML内からJavaScriptのスクリプトを使って、指定したクラス内のメソッドを実行できるのですね。
これには、「addJavascriptInterface」というWebViewのメソッドを利用します。これは、以下のような形で呼び出します。
下に、簡単なサンプルを挙げておきましょう。アプリを実行すると、画面にトーストでメッセージが表示されます。ここでは、JSObjというクラスを用意し、そこにshowMsgというメソッドを用意しています。そして、
実をいえば、WebViewでは、JavaScript内からJavaの機能(つまり、アプリに用意したクラスのメソッドなど)を呼び出すことが出来る仕組みになっているのです。あらかじめ呼び出すクラスを定義しておき、WebViewに表示するHTML内からJavaScriptのスクリプトを使って、指定したクラス内のメソッドを実行できるのですね。
これには、「addJavascriptInterface」というWebViewのメソッドを利用します。これは、以下のような形で呼び出します。
[WebView].addJavascriptInterface( インスタンス , 名前 );このaddJavascriptInterfaceは、第1引数のインスタンスを、第2引数で指定した名前でJavaScript内から利用できるようにするものです。例えば、
webview01.addJavascriptInterface(new Test(),"test");こんな具合に実行すると、Testというクラスのインスタンスを、testという名前のオブジェクトとしてJavaScriptから利用できるようになります。
下に、簡単なサンプルを挙げておきましょう。アプリを実行すると、画面にトーストでメッセージが表示されます。ここでは、JSObjというクラスを用意し、そこにshowMsgというメソッドを用意しています。そして、
webview01.addJavascriptInterface(new JSObj(this), "jsobj");このようにして、JSObjのインスタンスを、jsobjという名前でJavaScriptから使えるようにしています。ここで表示しているHTMLのソースコードを見てみると、JavaScriptのスクリプトで、
function init(){ jsobj.showMsg('Hello!!'); }こんな形でjsobjのshowMsgを呼び出していることがわかるでしょう。このinit関数を、<body>のonloadで呼び出すようにしていた、というわけです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
package jp.tuyano.sample; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.webkit.WebView; import android.widget.Toast; 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), "jsobj"); String data = "<html><head><script type=\"text/javascript\">" + "function init(){ jsobj.showMsg('Hello!!'); }" + "</script></head><body onload=\"init()\">" + "<h1>Sample</h1><p>JavaScript test.</p></bod></html>"; webview01.loadData(data,"text/html","utf8"); } } class JSObj { private Context context; public JSObj(Context c){ context = c; } public void showMsg(String msg) { Toast.makeText(context, msg,Toast.LENGTH_LONG).show(); } }
※関連コンテンツ