and roid webViewは原生と対話する。

7150 ワード

本文
すべてはプロジェクトWebView Studyに基づいて説明しています。最小のユニットのケースです。参考研究として、いくつかの方面から説明しています。
  • 1、JavaはWebView内のjsコード(伝達パラメータ)
  • を呼び出します。
  • 、WebView内のjsコードはJavaローカル方法(伝達パラメータ)
  • を呼び出す。
  • 、外部注入jsコード
  • 、WebView長押しイベント
  • 関連JSコード:
    
    
        js  android    
        
        
        
            function javacalljs(){
                 document.getElementById("content").innerHTML +=
                     "<br\>java   js  ,  ";
            }
    
            <!--       android       -->
            function javacalljswithargs(data){
                 document.getElementById("content").innerHTML +=
                     ("<br\>"+data);
            }
    
        
    
    
        

  • javaコードを び すにはクリックしてください。
  • javaコードを び してパラメータを えるにはクリックしてください。

  • JavaはWebView内のjsコードを呼び出します。(パラメータを伝える)
    //JavaScriptを有効にするとWebViewに伝えます。デフォルトはfalseです。ws.set Java Script Empled(true)1、呼び出しをクリックしたらそのまま実行すればいいです。
    //      
    webView.loadUrl("javascript:javacalljs()");
    //       
    webView.loadUrl("javascript:javacalljswithargs('" + "android         ,  " + "')");
    
    2、表示後に呼び出したら、html表示が完了したらMyWebView Cient.javaに置くように注意してください。
    @Override
        public void onPageFinished(WebView view, String url) {
            //      
            webView.loadUrl("javascript:javacalljs()");
            //       
            webView.loadUrl("javascript:javacalljswithargs('" + "android         ,  " + "')");
            super.onPageFinished(view, url);
        }
    
        /**
         * 4.4     evaluateJavascript    
         */
        private void load(String jsCode) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                evaluateJavascript(jsCode, null);
            } else {
                loadUrl(jsCode);
            }
        }
    
    WebViewの中のjsコードはJavaローカルメソッドを呼び出します。
    ここにはjsのクリック方法があります。
  • javaコードを び すにはクリックしてください。
  • javaコードを び してパラメータを えるにはクリックしてください。
  • jsとのインタフェースを実現する:
    webView.addJavascriptInterface(new MyJavascriptInterface(this), "injectedObject");
    
    ここの「injectedObject」はjsの「window.inject edbject.startFunction」に対応しています。この中でMyJavascript Interface.java:
    /**
     * Created by jingbin on 2016/11/17.
     * js    
     */
    public class MyJavascriptInterface {
        private Context context;
    
        public MyJavascriptInterface(Context context) {
            this.context = context;
        }
    
        /**
         *       js:
         * imageClick    js       
         *
         * @param src      
         */
        @JavascriptInterface
        public void imageClick(String src) {
            Log.e("imageClick", "----     ");
            Log.e("src", src);
        }
    
        /**
         *       js
         *   
  • * * @param type
  • type * @param item_pk item_pk */ @JavascriptInterface public void textClick(String type, String item_pk) { if (!TextUtils.isEmpty(type) && !TextUtils.isEmpty(item_pk)) { Log.e("textClick", "---- "); Log.e("type", type); Log.e("item_pk", item_pk); } } /** * js, */ @JavascriptInterface public void startFunction() { Log.e("startFunction", "---- "); } /** * js, , data * * @param data js */ @JavascriptInterface public void startFunction(String data) { Log.e("startFunction", "---- " + data); } }
  • そして対標の中の二つの方法:
        /**
         *      js,     
         */
        @JavascriptInterface
        public void startFunction() {
            Log.e("startFunction", "----  ");
        }
    
        /**
         *      js,     ,     data
         *
         * @param data   js     
         */
        @JavascriptInterface
        public void startFunction(String data) {
            Log.e("startFunction", "----  " + data);
        }
    
    外部注入jsコード
    時々私たちはウェブページを入手します。このページは私たちが注文したものではなく、中には私たちが呼び出したjsコードがありません。この時にはフロントエンドで直接jsに注入できます。例えば、ウェブページの中に写真があります。写真をクリックして、写真を見たいです。そして、写真を現地に保存したいです。この時、ホームページはこのjs方法を実現していません。しかし、jsコードを注入して、この需要を実現します。
    ロードが完了したら、このjsを呼び出します。
    //   js       ,     img  ,   onclick  ,                  java     url  
    webView.loadUrl("javascript:(function(){" +
            "var objs = document.getElementsByTagName(\"img\");" +
            "for(var i=0;i
    この時にMyJavascript Interface.javaのイメージClick方法を見ます。
        /**
         *       js:
         * imageClick    js       
         *
         * @param src      
         */
        @JavascriptInterface
        public void imageClick(String src) {
            Log.e("imageClick", "----     ");
            Log.e("src", src);
        }
    
    srcは写真リンクとして表示・ダウンロード用として利用できます。
    WebView長押しイベント
    webView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            final WebView.HitTestResult hitTestResult = webView.getHitTestResult();
            //                    
            if (hitTestResult.getType() == WebView.HitTestResult.IMAGE_TYPE ||
                    hitTestResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                //           
                new AlertDialog.Builder(WebViewActivity.this)
                        .setItems(new String[]{"    ", "       "}, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                String picUrl = hitTestResult.getExtra();
                                //    
                                Log.e("picUrl", picUrl);
                                switch (which) {
                                    case 0:
                                        break;
                                    case 1:
                                        break;
                                    default:
                                        break;
                                }
                            }
                        })
                        .show();
                return true;
            }
            return false;
        }
    });
    
    参考資料
    著者:Jinbeenリンク:https://www.jianshu.com/p/97f52819a19d 出所:略書の著作権は作者の所有になります。商業転載は作者に連絡して授権を獲得してください。商業転載ではないので、出典を明記してください。