編輯:關於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(); } });
首先定義一個接口類:
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交互,存在安全問題,下一次將學習如何用框架來實現,解決安全問題。
工廠模式是一種創建者模式,在任何生成復雜對象的地方都可以使用工廠模式。理論來說在任何使用A a = new A()的方式都可以使用工廠模式,雖然使用工廠模式可能需要多做一
最近很多人在玩一個《貪吃蛇大作戰》的游戲,以前小時候也經常在文曲星上玩貪吃蛇這個小游戲,於是自己就試著寫一個傳統的貪吃蛇游戲來玩玩,先寫了一個簡單demo。我們知道小蛇是
導讀這篇文章中我不會使用概念性文字來說明裝飾者模式,因為通常概念性的問題都很抽象,很難懂,使得讀者很難明白到底為什麼要使用這種設計模式,我們設計模式的誕生,肯定是前輩們在
??通過上一篇文件的分析,我們對Activity的啟動模式有了比較清晰的了解後,本篇我們將繼續對Activity啟動模式的相關參數和任務棧分析,接下來我們就繼續上一篇的問