Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android WebView 與js交互初探

Android WebView 與js交互初探

編輯:關於Android編程

時下混合型app已經成為了一種趨勢,是時候研究一波webview 與js交互了。廢話不多說,下面先認識一下webview 中的常用方法。

webView 中的settings,常用的一些配置:

1.websettings的配置

WebSettings settings = mWebView.getSettings();

//        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  //優先使用緩存
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//  不使用緩存:
        settings.setJavaScriptEnabled(true);//支持js
        settings.setDefaultTextEncodingName("UTF-8");//設置編碼方式
        settings.setBuiltInZoomControls(true); //便頁面支持縮放:
        settings.setSupportZoom(true);  //支持縮放
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持內容重新布局
        settings.supportMultipleWindows();  //支持多窗口
        settings.setAllowFileAccess(true);//設置可以訪問文件
        settings.setNeedInitialFocus(true);//當webview調用requestFocus時為webview設置節點 暫不知道什麼用
        settings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通過JS打開新窗口
//        打開頁面時, 自適應屏幕:
        settings.setUseWideViewPort(true);//設置此屬性,可任意比例縮放 將圖片調整到適合webview的大小
        settings.setLoadWithOverviewMode(true);// 縮放至屏幕的大小
        settings.setLoadsImagesAutomatically(true);  //支持自動加載圖片

 

2.webClient 的一些常用配置:

//返回值是true的時候控制去WebView打開,為false調用系統浏覽器或第三方浏覽器
        mClient = new WebViewClient() {
            @Override
            //在點擊請求的是鏈接是才會調用,重寫此方法返回true表明點擊網頁裡面的鏈接還是在當前的webview裡跳轉,
            // 不跳到浏覽器那邊。這個函數我們可以做很多操作,比如我們讀取到某些特殊的URL,
            // 於是就可以不打開地址,取消這個操作,進行預先定義的其他操作,這對一個程序是非常必要的。
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //返回值是true的時候控制去WebView打開,為false調用系統浏覽器或第三方浏覽器
                view.loadUrl(url);
                return false;
            }

            @Override
            //重寫此方法才能夠處理在浏覽器中的按鍵事件。
            public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
                return super.shouldOverrideKeyEvent(view, event);
            }

            @Override
            //(Key事件未被加載時調用)
            public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
                super.onUnhandledKeyEvent(view, event);
            }

            @Override
            // (WebView發生改變時調用)
            public void onScaleChanged(WebView view, float oldScale, float newScale) {
                super.onScaleChanged(view, oldScale, newScale);
            }

            @Override
            //重寫此方法可以讓webview處理https請求。
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
            }

            @Override
            //這個事件就是開始載入頁面調用的,通常我們可以在這設定一個loading的頁面,告訴用戶程序在等待網絡響應。
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
            }

            @Override
            //在頁面加載結束時調用。同樣道理,我們知道一個頁面載入完成,於是我們可以關閉loading 條,切換程序動作。
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }

            @Override
            // 在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

            @Override
            //(應用程序重新請求網頁數據)
            public void onFormResubmission(WebView view, Message dontResend, Message resend) {
                super.onFormResubmission(view, dontResend, resend);
            }

            @Override
            //(更新歷史記錄)
            public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
                super.doUpdateVisitedHistory(view, url, isReload);
            }
        };
        mWebView.setWebViewClient(mClient);

 

3. webview 的一些配置

 

//        如果webView中需要用戶手動輸入用戶名、密碼或其他,則webview必須設置支持獲取手勢焦點。
        mWebView.requestFocusFromTouch();
//        mWebView.loadUrl("http://baidu.com");
        mWebView.loadUrl("file:///android_asset/test.html");
        //覆蓋WebView默認使用第三方或系統默認浏覽器打開網頁的行為,使網頁用WebView打開
        mWebView.addJavascriptInterface(MainActivity.this,"myObj");
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                // TODO Auto-generated method stub
                if (newProgress == 100) {
                    // 網頁加載完成

                } else {
                    // 加載中

                }

            }
        });
以上列出了可能用到的方法,但並不是都需要用到,根據自己的情況而定。

 

4.下面就來說說js交互,首先先貼出html文件的代碼:

<html charset='UTF-8'>  
<meta content=”width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;” name=”viewport” />  
<meta content=”telephone=no” name=”format-detection” />  
<head>  
<script language="javascript">  
function wave(){  
   alert("aaaa");  
   document.getElementById("js").innerHTML="調用android代碼修改了此div";  
}  
function tz(){  
    window.location.href='test222.html';  
  
}  
function jsMethod(){  
  document.getElementById("js").innerHTML="android調用了JS代碼修改了div內容";  
}  
</script>  
</head>  
<body>  
  
<a href="http://www.open-open.com/lib/view/open1431569835951.html">哈哈</a>  
<button onclick='tz()'> 跳轉</button>  
<div id='js'>我是一個div </div>  
<button id='fromAndroid'> 調用andriod代碼的方法</button>  
  <script>  
    var fromAndroid= document.getElementById("fromAndroid");  
    fromAndroid.addEventListener('click', function(){  
        //調用android本地方法  
        myObj.AndriodMethod();  
        return false;  
    }, false);  
  </script>  
</body>  
</html>  

5.android中調用js代碼:

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mWebView.loadUrl("javascript:jsMethod()");//此處方法名必須跟js中一致
                Toast.makeText(MainActivity.this, "調用javascript:funFromjs()", Toast.LENGTH_LONG).show();
            }
        });

6.讓js調用android中代碼:

 

首先定義一個接口類:

 

 class JavaCode{
        //在17以上必須做此聲明
        @JavascriptInterface
        public void AndriodMethod(){
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    //所有的mmWebView必須在同一線程中
                    mWebView.loadUrl("javascript:wave()");
                }
            });

        }
    }

 

html調用android中的方法:

首先需要注冊這個接口:
 

<pre code_snippet_id="1816012" snippet_file_name="blog_20160808_7_5367374" name="code" class="java">//參數解釋:第一個就是接口名稱 第二個是接口的別名,在html中調用此方法的時就用這個對象名稱  
 mWebView.addJavascriptInterface(new JavaCode(),"myObj"); 

第一種:通過onclick直接進行調用

<a id="fromAndroid" onClick="window.<span style="font-family:Arial, Helvetica, sans-serif;">myObj</span>.clickOnAndroid()"><div style="width:80px;  
            margin:0px auto;  
            padding:10px;  
            text-align:center;  
            border:2px solid #202020;" >  

第二種:隨後注冊事件,個人比較支持這種方法,符合mvc思想

<script>  
    var fromAndroid= document.getElementById("fromAndroid");  
    fromAndroid.addEventListener('click', function(){  
        //調用android本地方法  
        demo.clickOnAndroid();  
        return false;  
    }, false);  
</script>  


這是通過原生的webview實現js交互,存在安全問題,下一次將學習如何用框架來實現,解決安全問題。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved