AndroidのWebViewコントロールを使用してローカルコードを呼び出す
読者は、関連する言語で特定のプログラミング基盤を持っている必要があります。
環境設定の簡単な説明
* http://developer.android.com/を開き、AndroidSDKと統合されたEclipseバージョンをダウンロードします
* http://www.java.com/を開き、対応するJDKの最新バージョンをダウンロードします。JREではなくJDKであることに注意してください
インストール後、JAVA_HOMEパスを構成し、Eclipseを開き、新しいAndroidアプリケーションプロジェクトを作成して、直接実行します。
成功すると、Androidエミュレーターが開き、helloworldが表示されます。
上記の手順が失敗した場合。。。次のステップは、成功するまで実行できます。。。
私が操作するとき、EclipseのSDKバージョンはKitKatです。以前と比較して、Android開発環境のセットアップははるかに簡単です。
プロジェクトでMainActivity.javaファイルを開きます。
次のコードをコピーして、元のコードを上書きし、再コンパイルして実行すると、効果を確認できます。
これは私が今言った比較的安全な方法です。コードの一部はインターネットから参照されています。コードの詳細を自分で調べてください。どういたしまして。(Android 2.1も合格できます)
package com.example.appa;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
private WebView webview = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);//可要可不要
initWebWiew();
}
@JavascriptInterface
private void initWebWiew() {
if( webview == null )
{
//实例化WebView对象
webview = new WebView(this);
//设置WebView属性,能够执行Javascript脚本
webview.getSettings().setJavaScriptEnabled(true);
//加载第一个页面,页面不能太大
//loadWebsite();//load外网地址
loadLocal();//加载本地
//设置Web视图
setContentView(webview);
}
}
private void loadWebsite() {
//如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。
webview.setWebViewClient(
new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
);
webview.loadUrl("http://www.baidu.com/");
}
private Handler mHandler = new Handler();
@JavascriptInterface
private void loadLocal() {
/*
*这是老版本的写法
Object interfaceObject = new Object() {
public void onClickAndroid() {
mHandler.post(
new Runnable() {
public void run() {
webview.loadUrl("javascript:wave()");
}
}
);
}
};
webview.addJavascriptInterface(interfaceObject, "androidCallback");
*/
//android 4.2, JDK1.7后新版本写法
webview.addJavascriptInterface(new JsObject(), "androidCallback");
//这个 onClickAndroid() 和 androidCallback 的命名,就是对应HTML里面的window.androidCallback.onClickAndroid
webview.loadData(tp, "text/html", "utf-8");
}
private class JsObject {
private String param;
@JavascriptInterface
public void onClickAndroid(String p) {
param = p;
mHandler.post(
new Runnable() {
public void run() {
Log.d("dbg", "receive param:" + param);
String s = param + " " + String.valueOf( Math.round( Math.random()*100 ) );
/*
try {
s = URLEncoder.encode(s, "utf-8");
} catch (Exception e) {
s = "Error";
}
*/
//webview.loadData(s, "text/html", "utf-8");
webview.loadUrl("javascript:responseFromAndroid('" + s + "')");
}
}
);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
private static final String tp =
"<font color='#FF00FF'><h1>Test</h1></font>" +
"name:<input type='text' id='txtName'/><br>" +
"age:<input type='text' id='txtAge'/><br>" +
"message:<input type='text' id='txtResult' value=''/><br>" +
"<input type='button' id='btnGo' value='go' onClick='onClickA()'/>" +
"<script>" +
"function onClickA() {" +
" var name = document.getElementById('txtName').value;" +
" var age = document.getElementById('txtAge').value;" +
" var s = name + ',' + age;" +
" window.androidCallback.onClickAndroid(s);" +
"}" +
"function responseFromAndroid(s) { " +
"document.getElementById('txtResult').value = s;" +
"}" +
"</script>";
}