本人博客地址:http://my.oschina.net/lijindou/blog
轉載請標明原址:https://my.oschina.net/lijindou/blog/746993
這個 剛開始 我也不會,把我整的是個蛋疼的啊,
最後發現其實挺簡單的,我現在給大家說的是我自己掌握的一種,
1. 先是要給項目配置一些權限
(1)、訪問網絡權限
<uses-permission android:name="android.permission.INTERNET" />
(2)、訪問SD卡權限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
2.給webview 配置
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setJavaScriptEnabled(true);
3.這個就是webview想JS 暴露一個 可以調用的對象(用來JS調用JAVA方法和JAVA調用JS又返回值的方法時用,如果非上面的兩種情況時,則可以忽略此步。)
webView.addJavascriptInterface(new JsToJava(), "android"); //JsToJava是內部類,代碼在後面。android 是接口名字。
上面的是準備工作
下面的就是要調用的代碼了
java調用JS 方法(無返回值)
webView.loadUrl("javascript:getStsmA()");//調用 JS 中的方法
沒錯,你沒有看錯,就是這麼簡單,在加載完HTML頁面後,執行這段代碼,就可以調用JS 中的方法了
JS調用java
webView.addJavascriptInterface(new JsToJava(), "android"); //JsToJava是內部類,代碼在後面。android 是接口名字。
webView.loadUrl("javascript:getStsmA()");//調用JS中的方法
private class JsToJava { @JavascriptInterface public void getStsm(String paramFromJS) {//java暴露的方法,用於 JS 調用 Log.e(TAG, "js返回結果===" + paramFromJS);//處理返回的結果 } }
我在貼出來JS 代碼
大家要注意了最後一段代碼
window.android.getStsm(rtn) ;
這段代碼的意思是JS調用JAVA中的方法
android:java中想JS 中暴露的對象名
getStsm:用Java中暴露的對象名。方法名(就是調用java中的getStsm()這個方法)
這樣JS 就可以通過java這邊暴露的對象名和方法名調用
大家要輸還是不理解的話,就看看 這張圖吧!!!
好了 給大家上代碼 吧
import android.annotation.SuppressLint; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.webkit.JavascriptInterface; import android.webkit.WebView; import android.widget.Button; public class MainActivity extends AppCompatActivity { private WebView webView; private static final String TAG = "MainActivity"; private Button but; @SuppressLint("JavascriptInterface") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) this.findViewById(R.id.webView_viewTable); but = (Button) this.findViewById(R.id.but); /** *在Android中要 用java調用 JS 很簡單 直接 *webView.loadUrl("javascript:getfsA()");//調用 JS 中的方法 *這個就是調用無返回值的 方式,直接一句話 (當然 對webview 還有一些 配置,在這裏 先 不說了) * 傳參數給webview 的話 ,就是在 * webView.loadUrl("javascript:getfsA('參數')");//調用 JS 中的方法 * 就是上面的方法 * 這樣 我們的 java 調用 JS 的無返回值 方法 ,就完了 * * 要調用又返回值的話,我們這邊不是接收者,而是我們調用JS 中的方法, * 讓此方法調用 本地的 一個java方法,然後 傳值過來,這樣 我們就接收到值了 * */ //這幾行代碼是對webview的授權,不能少 webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JsToJava(), "android"); //JsToJava是內部類,代碼在後面。android 是接口名字。 /** 這裏的 第二個參數 就是 JS 回調 java的 一個方法名大家注意看下html文件中 調用的方法的返回 window.android.getfs(rtn);//JS 中 的代碼,這句代碼的意思是,通過android這個java暴露的藉口,調用getfs()這個方法 * **/ webView.loadUrl("file:///storage/emulated/0/1.html");//這句是載入一個html頁面。 but.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { webView.loadUrl("javascript:getfsA()");//調用 JS 中的方法 } }); } private class JsToJava { @JavascriptInterface public void getfs(String paramFromJS) {//Android暴露的方法,用於 JS 調用 //這個方法就是JS 調用java方法 ,傳回 返回值,這樣我們就接收到JS 返回給我們的值了 Log.e(TAG, "js返回結果===" + paramFromJS);//處理返回的結果 } } }
下面的是html 代碼
function getStsmA() {
var rtn = getStsm();
window.android.getStsm(rtn) ; }