android webview 監聽js,Android webview與js的數據交互

項目要用到Webview和js交互,查了查以前的項目感覺還是有必要整理下的。

簡單描述下項目中用到的地方,比如說在web頁需要用到登錄的地方點擊登錄跳轉到APP原生登錄界面去登錄,點擊web頁的撥打電話彈出原生dialog詢問是否撥打,點擊web頁里面的圖片進行放大處理。針對于上述的需求我們通用的方式大概有兩種,一是監聽a標簽,在shouldOverrideUrlLoading根據URL進行判斷,二是js代碼注入,找到我們想要處理的元素進行js代碼注入。下面就這兩種方式簡單的進行描述

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

WebSettings webSetting = webView.getSettings();

// 支持JavaScript

webSetting.setJavaScriptEnabled(true);

// 設置可以訪問文件s

webSetting.setAllowFileAccess(true);

// 告訴javascript來自動打開的窗口。這適用于JavaScript函數的窗口,open()。

webSetting.setJavaScriptCanOpenWindowsAutomatically(true);

// 支持縮放

webSetting.setSupportZoom(true);

// 是否禁止是網絡加載數據

webSetting.setBlockNetworkLoads(false);

// 設置是否支持多窗口

webSetting.setSupportMultipleWindows(true);

// 是否開啟本地DOM存儲

webSetting.setDomStorageEnabled(true);

// 設置不緩存

webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

// 阻塞加載圖片

webSetting.setBlockNetworkImage(false);

// 支持啟用插件

webSetting.setPluginState(WebSettings.PluginState.ON);

// 設置任意比較縮放為真

webSetting.setUseWideViewPort(true);

// 設置WebView加載頁面的模式

webSetting.setLoadWithOverviewMode(true);

// 控制頁面顯示布局

// NARROW_COLUMNS:可能的話使所有列的寬度不超過屏幕寬度

// NORMAL:正常顯示不做任何渲染

// SINGLE_COLUMN:把所有內容放大webview等寬的一列中

webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

//禁止用地理定位

webSetting.setSaveFormData(true);

// 是否啟動地理定位

webSetting.setGeolocationEnabled(true);

// 設置定位的數據庫路徑

webSetting.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

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

onLoadResource() // 在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。

shouldOverrideUrlLoading //在點擊請求的是鏈接是才會調用,重寫此方法返回true表明點擊網頁里面的鏈接還是在當前的webview里跳轉,不跳到瀏覽器那邊。這個函數我們可以做很多操作,比如我們讀取到某些特殊的URL,于是就可以不打開地址,取消這個操作,進行預先定義的其他操作,這對一個程序是非常必要的。

onPageStart //這個事件就是開始載入頁面調用的,通常我們可以在這設定一個loading的頁面,告訴用戶程序在等待網絡響應。

onPageFinish //在頁面加載結束時調用。同樣道理,我們知道一個頁面載入完成,于是我們可以關閉loading 條,切換程序動作。

onReceiveError // (報告錯誤信息)

onReceivedHttpAuthRequest ()//(獲取返回信息授權請求)

WebChromeClient是輔助WebView處理Javascript的對話框,網站圖標,網站title,加載進度等 ,常用方法有以下幾個:

onCloseWindow() //關閉WebView

onCreateWindow()

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

onJsPrompt

onJsConfirm

onProgressChanged //可以根據加載進度設置進度條

onReceivedIcon //可以獲取URL icon

onReceivedTitle //可以獲取URL title

一、監聽a標簽

這種實現方式比較簡單,我們可以在shouldOverrideUrlLoading中根據URL進行判斷,比如說界面中有一個撥打電話的功能,其js代碼如下

e950c31b53af13e73227b7b729ccccad.png

這里我們可以通過如下方式進行彈出原生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代碼

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

比如說我們給所有的圖片設置一個點擊事件來獲取圖片,進行一些列放大存儲等操作,我們可以通過如下代碼來實現。

// 注入js函數監聽

private void addImageClickListner() {

// 這段js函數的功能就是,遍歷所有的img幾點,并添加onclick函數,函數的功能是在圖片點擊的時候調用本地java接口并傳遞url過去

webView.loadUrl("javascript:(function(){" +

"var objs = document.getElementsByTagName(\"img\"); " +

"for(var i=0;i

"{"

+ " objs[i].οnclick=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();

}

}

//上述兩個方法實現了給圖片添加點擊事件,我們還需要對webview進行設置以及注入

@SuppressLint({"JavascriptInterface", "NewApi"})

@Override

public void onPageFinished(WebView view, String url) {

view.getSettings().setJavaScriptEnabled(true);

super.onPageFinished(view, url);

addImageClickListner();// 頁面加載完成之后,添加監聽圖片的點擊js函數

}

//對WebView進行設置

webView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");

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

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

這是我現階段知道的方式,如果還有其它比較好的實現方式可以一起討論下。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542373.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542373.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c ++查找字符串_C ++異常處理| 查找輸出程序| 套裝1

c 查找字符串Program 1: 程序1&#xff1a; #include <iostream>using namespace std;int main(){try {int num1 10;int num2 0;int res 0;res num1 / num2;}catch (exception e) {cout << "Exception: Divide By Zero" << endl;}return 0;}O…

python的repr和str有什么不同_str()和repr()的異同

str()函數和repr()函數&#xff0c;都是Python內置的標準函數。這兩個函數都是根據參數對象返回一個字符串&#xff0c;但是又有一些不一樣的地方。我們在使用的時候&#xff0c;常常搞混&#xff0c;傾向于使用簡單明了的str()函數&#xff0c;而搞不清楚為什么還有一個不知所…

android web通訊錄,Android手機開發之通訊錄

Android手機開發——通訊錄實現增加、查詢、修改、刪除的功能&#xff0c;輸入聯系人信息&#xff0c;點擊“添加”按鈕&#xff0c;可以添加聯系人信息到數據庫&#xff1b;點擊“查詢”按鈕&#xff0c;會發現添加的聯系人信息顯示在界面中&#xff1b;重新輸入聯系人電話&am…

有關UITableView--cell復用問題

近來用Tableview做了一個九宮格。過程中碰到了兩個cell復用問題。 問題一&#xff1a; 在cell中為button添加addTarget點擊事件時&#xff0c;出現后面的cell會重疊它前面cell的事件。代碼如下&#xff1a; C代碼 static NSString *CellWithIdentifier "DiscoverHomeTab…

python客戶端和服務端實驗_結合服務器和客戶端python

我正在嘗試使用python(稍后可能用c語言)和TCP套接字制作一個本地網絡聊天程序。我的目的是讓服務器監聽當前計算機的地址以獲取傳入消息&#xff0c;并將這些消息轉發給客戶端(我現在還不確定)。客戶端將是一個簡單的gui&#xff0c;可以通過本地連接向活動服務器發送消息。實際…

python常用語法和示例_C語言切換案例教程,語法,示例和規則

python常用語法和示例使用默認情況下的決策 (Decision making using switch-case-default) Many times in our daily lives, we face conditions where we are required to choose between a number of alternatives rather than just two or three. For example, which school…

android so abi適配,Android NDK學習(六): so文件兼容之abiFilters的使用

最近項目中遇到了要使用JavaCV的情況&#xff0c;涉及到了abi兼容的選擇。因為如果全部都適配的話&#xff0c;包很大&#xff0c;這樣兼容那些用戶數極少的cpu就很不劃算&#xff0c;所以我只適配了armeabi-v7a這一個。但是今天在x64-v8a的模擬器上看的時候&#xff0c;提示我…

python中doc=parased.getroot()_python中執行sed命令操作源文件時出現錯誤

我想在python中執行一個sed命令&#xff0c;第一種方法直接指定文件時&#xff0c;可以正確輸出結果&#xff0c;但是第二種我打開文件操作的時候就有問題&#xff0c;不知道什么原因&#xff0c;求高手解答&#xff1f;(1)>>> sedcmd"sed -n \s/{//g; p\ /qye/p…

JavaScript基礎之Number對象和Math對象

2019獨角獸企業重金招聘Python工程師標準>>> //Math對象//屬性float Math.E; //返回自然對數的底數e&#xff0c;約2.718float Math.LN2; //返回2的自然對數&#xff0c;約0.693float Math.LN10; //返回10的自然對數&#xff0c;約2.302fl…

c++ stl 獲取最小值_如何在C ++ STL中找到向量的最小/最小元素?

c stl 獲取最小值Given a vector and we have to minimum/smallest element using C STL program. 給定一個向量&#xff0c;我們必須使用C STL程序最小/最小元素。 尋找向量的最小元素 (Finding smallest element of a vector) To find a smallest or minimum element of a …

android studio panic,Android Studio模擬器PANIC錯誤

Android Studio模擬器突然停止工作.當我嘗試運行虛擬設備時,我在事件日志中收到以下錯誤.模擬器:PANIC:找不到AVD系統路徑.請定義ANDROID_SDK_ROOT仿真器:處理完成,退出代碼為1所以我檢查了ANDROID_SDK_ROOT環境變量設置的值,它是空的.所以我把它設置為/Users/{username}/Libra…

linux特殊權限之訪問權限

特殊權限如/etc/passwd:sSuid:普通用戶以管理員身份運行命令&#xff08;chmod us FILE、chmod u-s FILE&#xff09;如果FILE本身原來就有執行權限&#xff0c;SUID顯示為s&#xff1b;否則顯示SSgid:基本組以管理組身份運行命令&#xff08;chmod gs FILE、chmod g-s FILE&am…

vb.net變量值變化觸發事件_Angular變化檢測的理解

獲取臟檢查的時機Angular 使用NgZone獲取變化的通知&#xff0c;然后進行全面的變化檢測&#xff0c;進而更新Dom臟檢查的過程Angular的數據流是自頂而下&#xff0c;從父組件到子組件單項流動&#xff0c;單項數據流保證了高效可預測的變化檢測。盡管檢查了父組件之后&#xf…

python 算術右移_Python算術序列| 競爭編碼問題

python 算術右移Question: 題&#xff1a; In mathematics, when in an arithmetic sequence is a sequence of numbers such that the difference between the consecutive terms is constant then it is called arithmetic constant. 在數學中&#xff0c;當在算術序列中是…

Android8內測申請,小米 6 安卓 8.0 來了 內測開始招募

Android 8.0 已經正式發布多時&#xff0c;目前不少廠商已經啟動了旗下進行的 Android 8.0 適配計劃。但令人納悶的是&#xff0c;一向對系統升級比較熱心的小米卻遲遲沒有動靜。好消息是&#xff0c;此前網友曝光的消息顯示&#xff0c;MIUI 已經悄然在官方論壇中招募小米 6 的…

My linux

為什么80%的碼農都做不了架構師&#xff1f;>>> 1.linux 命令方式修改機器名稱 # hostname newHostName # vi /etc/sysconfig/network 修改或增加配置&#xff1a;hostnamenewHostName # vi /etc/hosts 修改對應的本地HOST映射 xx.xxx.xxx.xxx newHostName 2.Redha…

狂神說es筆記_人教版七上英語Unit5電子課本音頻+課堂筆記+課后同步習題

1人教 七上英語Unit5單詞七年級英語上冊Unit 5單詞默寫1做&#xff1b;干(助動詞)__________2做&#xff0c;干(助動詞第三人稱單數形式)__________3有__________4網球__________5球__________6乒乓球______7球棒&#xff1b;球拍__________8(英式)足球____________________9排…

Java RandomAccessFile getFilePointer()方法與示例

RandomAccessFile類getFilePointer()方法 (RandomAccessFile Class getFilePointer() method) getFilePointer() method is available in java.io package. getFilePointer()方法在java.io包中可用。 getFilePointer() method is used to get the current pointer in the Rando…

先進技術android,React Native實戰(JavaScript開發iOS和Android應用)/計算機科學先進技術譯叢...

導語內容提要本書作者Nader Dabit是AWS Mobile開發人員、React Native Training創始人和React Native Radio播客主持人。本書旨在幫助iOS、Android和Web開發人員學習使用React Native框架&#xff0c;構建高質量的iOS和Android應用程序。書中介紹了React Native入門基礎知識&am…

開發類似vs的黑色風格_傳聞:2020年《使命召喚》將是《黑色行動》重啟作品

據可信度較高的消息源透露&#xff0c;2020 年的《使命召喚》將是《黑色行動》的重啟作。而據之前的報道&#xff0c;《黑色行動》開發商 Treyarch 正在開發今年的《使命召喚》&#xff0c; Sledgehammer Games 和 Raven Software 負責輔助工作。該項目代號為“宙斯”&#xff…