Android應(yīng)用中的webview怎么與JavaScript進(jìn)行數(shù)據(jù)交互

本篇文章為大家展示了Android應(yīng)用中的webview怎么與JavaScript進(jìn)行數(shù)據(jù)交互,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括天河網(wǎng)站建設(shè)、天河網(wǎng)站制作、天河網(wǎng)頁制作以及天河網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,天河網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到天河省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

首先需要初始化WebView以及設(shè)置支持JavaScript,常用的配置屬性有一下幾種,可以在項(xiàng)目中根據(jù)需求添加

 WebSettings webSetting = webView.getSettings();
 // 支持JavaScript
 webSetting.setJavaScriptEnabled(true);
 // 設(shè)置可以訪問文件s
 webSetting.setAllowFileAccess(true);
 // 告訴javascript來自動(dòng)打開的窗口。這適用于JavaScript函數(shù)的窗口,open()。
 webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
 // 支持縮放
 webSetting.setSupportZoom(true);
 // 是否禁止是網(wǎng)絡(luò)加載數(shù)據(jù)
 webSetting.setBlockNetworkLoads(false);
 // 設(shè)置是否支持多窗口
 webSetting.setSupportMultipleWindows(true);
 // 是否開啟本地DOM存儲(chǔ)
 webSetting.setDomStorageEnabled(true);
 // 設(shè)置不緩存
 webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
 // 阻塞加載圖片
 webSetting.setBlockNetworkImage(false);
 // 支持啟用插件
 webSetting.setPluginState(WebSettings.PluginState.ON);
 // 設(shè)置任意比較縮放為真
 webSetting.setUseWideViewPort(true);
 // 設(shè)置WebView加載頁面的模式
 webSetting.setLoadWithOverviewMode(true);
 // 控制頁面顯示布局
 // NARROW_COLUMNS:可能的話使所有列的寬度不超過屏幕寬度
 // NORMAL:正常顯示不做任何渲染
 // SINGLE_COLUMN:把所有內(nèi)容放大webview等寬的一列中
 webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
 //禁止用地理定位
 webSetting.setSaveFormData(true);
 // 是否啟動(dòng)地理定位
 webSetting.setGeolocationEnabled(true);
 // 設(shè)置定位的數(shù)據(jù)庫路徑
 webSetting.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

接下來就是WebView交互中非常重要的兩個(gè)類WebViewClient和WebChromeClient。WebViewClient就是幫助WebView處理各種通知、請(qǐng)求事件的,具體來說包括以下常用方法:

onLoadResource() // 在加載頁面資源時(shí)會(huì)調(diào)用,每一個(gè)資源(比如圖片)的加載都會(huì)調(diào)用一次。  

shouldOverrideUrlLoading //在點(diǎn)擊請(qǐng)求的是鏈接是才會(huì)調(diào)用,重寫此方法返回true表明點(diǎn)擊網(wǎng)頁里面的鏈接還是在當(dāng)前的webview里跳轉(zhuǎn),不跳到瀏覽器那邊。這個(gè)函數(shù)我們可以做很多操作,比如我們讀取到某些特殊的URL,于是就可以不打開地址,取消這個(gè)操作,進(jìn)行預(yù)先定義的其他操作,這對(duì)一個(gè)程序是非常必要的。

onPageStart  //這個(gè)事件就是開始載入頁面調(diào)用的,通常我們可以在這設(shè)定一個(gè)loading的頁面,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)。 

onPageFinish //在頁面加載結(jié)束時(shí)調(diào)用。同樣道理,我們知道一個(gè)頁面載入完成,于是我們可以關(guān)閉loading 條,切換程序動(dòng)作。 

onReceiveError // (報(bào)告錯(cuò)誤信息) 

onReceivedHttpAuthRequest ()//(獲取返回信息授權(quán)請(qǐng)求) 

WebChromeClient是輔助WebView處理Javascript的對(duì)話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進(jìn)度等 ,常用方法有以下幾個(gè):

onCloseWindow()  //關(guān)閉WebView

onCreateWindow()  

onJsAlert //WebView上alert是彈不出來東西的,需要定制你的WebChromeClient處理彈出) 

onJsPrompt  

onJsConfirm  

onProgressChanged //可以根據(jù)加載進(jìn)度設(shè)置進(jìn)度條

onReceivedIcon //可以獲取URL icon

onReceivedTitle //可以獲取URL title

一、監(jiān)聽a標(biāo)簽

這種實(shí)現(xiàn)方式比較簡單,我們可以在shouldOverrideUrlLoading中根據(jù)URL進(jìn)行判斷,比如說界面中有一個(gè)撥打電話的功能,其js代碼如下

Android應(yīng)用中的webview怎么與JavaScript進(jìn)行數(shù)據(jù)交互

這里我們可以通過如下方式進(jìn)行彈出原生dialog

 public boolean shouldOverrideUrlLoading(WebView view, String url) {
      if (TextUtils.isEmpty(url))
        return true;
      if (url.startsWith("tel:")) {
        PhoneDialog callDialog = new PhoneDialog(WebViewActivity.this, url);
        callDialog.disDialog();
        callDialog.callPhone();
        callDialog.show();
        return true;
      }
      return true;
    }

二、通過js代碼

查了下常用的注入方式有兩種,第一種是當(dāng)webview加載完之后,讀取整個(gè)js文件中的內(nèi)容,然后將整個(gè)文件內(nèi)容以字符串的形式,通過webview.loadUrl(“javascript:fileContentString”)注入,不過我好像沒怎么用到過這個(gè)方式,一般都是用第二種,即通過給特定標(biāo)簽設(shè)置事件來滿足業(yè)務(wù)需求。

比如說我們給所有的圖片設(shè)置一個(gè)點(diǎn)擊事件來獲取圖片,進(jìn)行一些列放大存儲(chǔ)等操作,我們可以通過如下代碼來實(shí)現(xiàn)。

 // 注入js函數(shù)監(jiān)聽
  private void addImageClickListner() {
    // 這段js函數(shù)的功能就是,遍歷所有的img幾點(diǎn),并添加onclick函數(shù),函數(shù)的功能是在圖片點(diǎn)擊的時(shí)候調(diào)用本地java接口并傳遞url過去
    webView.loadUrl("javascript:(function(){" +
        "var objs = document.getElementsByTagName(\"img\"); " +
        "for(var i=0;i<objs.length;i++) " +
        "{"
        + "  objs[i].onclick=function() " +
        "  { "
        + "    window.imagelistner.openImage(this.src); " +
        "  } " +
        "}" +
        "})()");
  }

// js通信接口
  public class JavascriptInterface {

    private Context context;

    public JavascriptInterface(Context context) {
      this.context = context;
    }

    @android.webkit.JavascriptInterface
    public void openImage(String img) {
      Toast.makeText(context,img,Toast.LENGTH_SHORT).show();
    }
  }
//上述兩個(gè)方法實(shí)現(xiàn)了給圖片添加點(diǎn)擊事件,我們還需要對(duì)webview進(jìn)行設(shè)置以及注入

 @SuppressLint({"JavascriptInterface", "NewApi"})
    @Override
    public void onPageFinished(WebView view, String url) {
      view.getSettings().setJavaScriptEnabled(true);
      super.onPageFinished(view, url);
      addImageClickListner();// 頁面加載完成之后,添加監(jiān)聽圖片的點(diǎn)擊js函數(shù) 
    }
//對(duì)WebView進(jìn)行設(shè)置
webView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");

上述實(shí)現(xiàn)方式有以下幾點(diǎn)需要注意:1、注意這里的方法名imagelistener要和輸入的js代碼里面的方法一致,2、自定義的方法openImage一定要注明@Android.webkit.JavascriptInterface,否則不起作用。

可以看到我們注入的js代碼是通過getElementsByTagName獲取所有的img元素然后設(shè)置點(diǎn)擊事件,如果我們相對(duì)某一特定的元素進(jìn)行設(shè)置也可以通過getElementById獲取單獨(dú)的元素,或者還可以通過getElementsByTagName根據(jù)TAG獲取元素。

上述內(nèi)容就是Android應(yīng)用中的webview怎么與JavaScript進(jìn)行數(shù)據(jù)交互,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

名稱欄目:Android應(yīng)用中的webview怎么與JavaScript進(jìn)行數(shù)據(jù)交互
URL網(wǎng)址:http://muchs.cn/article48/pidoep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、App設(shè)計(jì)服務(wù)器托管、網(wǎng)站設(shè)計(jì)公司、營銷型網(wǎng)站建設(shè)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)