android 控制 WebView 內的 Javascript 互相調用 的方式記錄

一開始建立專案時 android 版本要先選 4.0 起跳
不然會錯誤一堆 因為舊的很多都已經不支援
也可以在 AndroidManifest.xml 裡面 修改
 android:minSdkVersion="14" // 這個不改會有很多問題 



在 AndroidManifest.xml 裡面加上網路權限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在主 /My_Web/res/layout/activity_main.xml

設計時 Composite 時拉 WebView 元件

 MainActivity 裡面內容如下:
WebView mWebView = (WebView)findViewById(R.id.webView1);

activity_main.xml 要記得先存檔
不然 R.id. 會找不到 webView1

類似 C# 的 webbrower
------------------------
在一開始
protected void onCreate(Bundle savedInstanceState) {
前先宣告 private WebView webView;
內容加入

 webView = (WebView)findViewById(R.id.webView1); webView.getSettings().setJavaScriptEnabled(true);//啟用Javascript //建立讓 Web 可以 Call 的元件 webView.addJavascriptInterface(new WebAppInterface(this), "Android"); webView.setWebViewClient(new MyWebViewClient());

這邊有錯誤 讓 Eclipse 幫我們先建
WebAppInterface,MyWebViewClient 這兩個類 跟檔案

addJavascriptInterface 這東西會要求在 onCreate 加入
@SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" }) 

----------------------------------------------------
webView.loadUrl("file:///android_asset/index.html"); //注意这个资源的位置放在assets文件夹下。
ps:變更放在 assets 目錄下的 測試Html 檔時 要記得 專案重新整理
不然網頁無法更新

1.由 Android 呼叫 Web 內的 Js

這個用不著 addJavascriptInterface
就是
webView.loadUrl("javascript:JsTest()");
就可以 Call
也可以 直接 加入 Javascript 的程式碼

webView.loadUrl("javascript:document.getElementById('tt').value = '測試'; ");

一加入便會執行
---------------------------------------------
2.Web內 呼叫 Android 的 function

這個就要用 addJavascriptInterface
//建立讓 Web 可以 Call 的元件 webView.addJavascriptInterface(new WebAppInterface(this), "Android");

WebAppInterface 內是讓 Web 呼叫的東東

以下是程式碼

//建立讓 Web 可以 Call 的元件 public class WebAppInterface { Context mContext; /* Instantiate the interface and set the context */ //這是接收 this 用 讓 底下函數 可以 用到 主畫面功能 如無用到 就可拿掉 this WebAppInterface(Context c) { mContext = c; } //以下都是讓 Web Call 的介面 public void showSource(String html) { Log.d("Vincent", html); } public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } }

//應用方法
一個是抓網頁原始碼
在 MyWebViewClient 裡當web load 完

 public void onPageFinished(WebView view, String url) {
         Log.d("Vincent","onPageFinished ");
         //將Javascript 注進 Html 內 並呼叫傳回  local_obj.showSource
view.loadUrl(
"javascript:window.Android.showSource('<head>'+ document.getElementsByTagName('html')[0].innerHTML+'</head>');");
         
         super.onPageFinished(view, url);

     }

紅色部分注意
Android 是建立 時 取的名字
webView.addJavascriptInterface(new WebAppInterface(this), "Android");

showSource是 內部要 call 的函數.


這個就是結合 注入 js 並執行後 傳回 給 android 的範例


-------------------------------
那 web 內 Js 怎麼 call android

在 web  內 js 碼
function showAndroidToast(toastmsg) { Android.showToast(toastmsg); }
只要在 web  內 call showAndroidToast("aa");
就會 Call android 內的 showToast
-------------------
打包收工



留言

熱門文章