Android WebViewとJSのデータインタラクション
7155 ワード
WebViewについて
現在のandroid市場のいくつかのアプリケーションが採用している開発方式は、Native App、Web App、Hybrid Appの3つに大きく分けられていることを知っています.本文は主にHybrid Appで実現される主な技術nativeコンポーネントとjsのデータインタラクションの理解と実現である.
Android APIでは、htmlのレンダリングを実現するためにWebViewコンポーネントが提供されています.HybridApp開発方式とは,HTML 5,CSS 3,jSに関する開発技術や,データ交換フォーマットjson/XMLを集約したものである.これは明らかにWeb開発エンジニアのスキルです.そのため、多くの中小企業がandroid開発エンジニアへの過度な依存を減らすためにこのような開発方式を選んだが、この3つの開発方式の比較と優劣は本稿では考慮しない.
WebViewというコンポーネントがあれば、Androidアプリケーション開発技術もhtmlとjavaデータのインタラクションに転嫁します.明らかにjsとWebViewのデータインタラクションであり,これが本稿で論じる.
WebViewとjsのデータインタラクション
1.WebViewに静的ページを読み込む
WebViewをアプリケーションに追加します.オリジナルコントロールと同様にlayoutにWebViewコントロールを導入します.コードクリップは次のとおりです.
ページの読み込み:
page.htmlは、エンジニアリングファイルのassetsルートディレクトリに格納されます.
2.jquery mobileの導入
jsフレームワークを導入することで、作成したhtmlページをオリジナルコントロールの表示効果に近づけます.現在主流のモバイルアプリケーションjsフレームワークは、jquery mobileとsencha touch(jquery mobileとsencha touchの選択型は本明細書で議論する範囲外)である.この文書では、jquery mobileを使用することを選択します.
まず、webviewにjsのサポートを追加します.
中国語のサポートを追加:
ページスクロールバースタイルを設定するには、次の手順に従います.
jquery mobileが提供する標準ページテンプレートTemplate Template ForJQuery.html:
ページ jsライブラリ、cssなどはassetsディレクトリの に され、ディレクトリの は の りです.
のスクリーンショットを します.
はbuttonのスクリーンショットで、 コントロールとは らかな いはなく、 の じがします.
3. なユーザー
たちのアプリケーションを すると、jsが にあるページがロードされている 、ずっと っていたことがわかります.これは いユーザー です.プログレスバー に できます.Webviewが する2つの に してください.setWebViewClientとsetWebChromeClientです.ここでsetWebChromeClientメソッドはprogressのロードを できるほか、jsダイアログボックスを したり、webviewにiconアイコンなどを したりすることもできます.progressを するコードフラグメントは、 のとおりです.
UIスレッドの はhandlerメッセージメカニズムによって されます.
setWebViewClientメソッドでは、htmlのロード(onPageStarted(WebViewview,String url,Bitmap favicon)のリロード、クローズ(onPageFinished(WebViewview,String url)メソッドのリロードが )の に に されます.
setWebViewClientとsetWebChromeClientの : は にwebViewの 、 えばロード、クローズ、エラー などを するために される. は にjsダイアログ、アイコン、ページタイトルなどを する.
4.javaのデータを する
jsとjavaのデータの を する しとしてインタフェースを で し, でカプセル したコードAndroidToastForJs.JAvaは の りです.
Webviewが するjsへの :
HtmlページjsonData.html の のコードは の りです.
say helloボタンをクリックして実行するスクリーンショットは以下の通りです.
現在のandroid市場のいくつかのアプリケーションが採用している開発方式は、Native App、Web App、Hybrid Appの3つに大きく分けられていることを知っています.本文は主にHybrid Appで実現される主な技術nativeコンポーネントとjsのデータインタラクションの理解と実現である.
Android APIでは、htmlのレンダリングを実現するためにWebViewコンポーネントが提供されています.HybridApp開発方式とは,HTML 5,CSS 3,jSに関する開発技術や,データ交換フォーマットjson/XMLを集約したものである.これは明らかにWeb開発エンジニアのスキルです.そのため、多くの中小企業がandroid開発エンジニアへの過度な依存を減らすためにこのような開発方式を選んだが、この3つの開発方式の比較と優劣は本稿では考慮しない.
WebViewというコンポーネントがあれば、Androidアプリケーション開発技術もhtmlとjavaデータのインタラクションに転嫁します.明らかにjsとWebViewのデータインタラクションであり,これが本稿で論じる.
WebViewとjsのデータインタラクション
1.WebViewに静的ページを読み込む
WebViewをアプリケーションに追加します.オリジナルコントロールと同様にlayoutにWebViewコントロールを導入します.コードクリップは次のとおりです.
ページの読み込み:
webView = (WebView) findViewById(R.id.webview);
webView.loadUrl("file:///file:///android_asset/page.html");
page.htmlは、エンジニアリングファイルのassetsルートディレクトリに格納されます.
2.jquery mobileの導入
jsフレームワークを導入することで、作成したhtmlページをオリジナルコントロールの表示効果に近づけます.現在主流のモバイルアプリケーションjsフレームワークは、jquery mobileとsencha touch(jquery mobileとsencha touchの選択型は本明細書で議論する範囲外)である.この文書では、jquery mobileを使用することを選択します.
まず、webviewにjsのサポートを追加します.
WebSettings setting = webView.getSettings();
setting.setJavaScriptEnabled(true);// js
中国語のサポートを追加:
WebSettings setting = webView.getSettings();
setting.setDefaultTextEncodingName("GBK");//
ページスクロールバースタイルを設定するには、次の手順に従います.
webView.setScrollBarStyle(0);// , 0 ,
jquery mobileが提供する標準ページテンプレートTemplate Template ForJQuery.html:
Page Title
Page Title
Page content goes here.
Page Footer
ページ jsライブラリ、cssなどはassetsディレクトリの に され、ディレクトリの は の りです.
のスクリーンショットを します.
はbuttonのスクリーンショットで、 コントロールとは らかな いはなく、 の じがします.
3. なユーザー
たちのアプリケーションを すると、jsが にあるページがロードされている 、ずっと っていたことがわかります.これは いユーザー です.プログレスバー に できます.Webviewが する2つの に してください.setWebViewClientとsetWebChromeClientです.ここでsetWebChromeClientメソッドはprogressのロードを できるほか、jsダイアログボックスを したり、webviewにiconアイコンなどを したりすることもできます.progressを するコードフラグメントは、 のとおりです.
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {//
if (progress == 100) {
handler.sendEmptyMessage(1);// ,
}
super.onProgressChanged(view, progress);
}
});
UIスレッドの はhandlerメッセージメカニズムによって されます.
handler = new Handler() {
public void handleMessage(Message msg) {// Handler, UI
if (!Thread.currentThread().isInterrupted()){
switch (msg.what) {
case 0:
pd.show();//
break;
case 1:
pd.hide();// , dismiss()、cancel(), show() , 。
break;
}
}
super.handleMessage(msg);
}
};
setWebViewClientメソッドでは、htmlのロード(onPageStarted(WebViewview,String url,Bitmap favicon)のリロード、クローズ(onPageFinished(WebViewview,String url)メソッドのリロードが )の に に されます.
setWebViewClientとsetWebChromeClientの : は にwebViewの 、 えばロード、クローズ、エラー などを するために される. は にjsダイアログ、アイコン、ページタイトルなどを する.
4.javaのデータを する
jsとjavaのデータの を する しとしてインタフェースを で し, でカプセル したコードAndroidToastForJs.JAvaは の りです.
public class AndroidToastForJs {
private Context mContext;
public AndroidToastForJs(Context context){
this.mContext = context;
}
//webview toast
public void showToast(String toast) {
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
//webview
public int sum(int a,int b){
return a+b;
}
// json webview js
public String jsontohtml(){
JSONObject map;
JSONArray array = new JSONArray();
try {
map = new JSONObject();
map.put("name","aaron");
map.put("age", 25);
map.put("address", " ");
array.put(map);
map = new JSONObject();
map.put("name","jacky");
map.put("age", 22);
map.put("address", " ");
array.put(map);
map = new JSONObject();
map.put("name","vans");
map.put("age", 26);
map.put("address", " ");
map.put("phone","13888888888");
array.put(map);
} catch (JSONException e) {
e.printStackTrace();
}
return array.toString();
}
}
Webviewが するjsへの :
webView.addJavascriptInterface(new AndroidToastForJs(mContext), "JavaScriptInterface");
HtmlページjsonData.html の のコードは の りです.
var result = JavaScriptInterface.jsontohtml();
var obj = eval("("+result+")");// json
function showAndroidToast(toast)
{
JavaScriptInterface.showToast(toast);
}
function getjsonData(){
var result = JavaScriptInterface.jsontohtml();
var obj = eval("("+result+")");// json
for(i=0;i<obj.length;i++){
var user=obj[i];
document.write("<p> :"+user.name+"</p>");
document.write("<p> :"+user.age+"</p>");
document.write("<p> :"+user.address+"</p>");
if(user.phone!=null){
document.write("<p> :"+user.address+"</p>");
}
}
}
function list(){
document.write("<div data-role='header'><p>another</p></div>");
}
Android via Interface
I'm document.write(obj[0].name); ,click to see my info
document.write("<p> :"+obj[0].name+"</p>");
document.write("<p> :"+obj[0].age+"</p>");
document.write("<p> :"+obj[0].address+"</p>");
Page Footer
say helloボタンをクリックして実行するスクリーンショットは以下の通りです.