1. 程式人生 > >java呼叫JS 與JS 調java

java呼叫JS 與JS 調java

這個 剛開始 我也不會,把我整的是個蛋疼的啊,

最後發現其實挺簡單的,我現在給大家說的是我自己掌握的一種,

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) ; }