當前位置:首頁 » 安卓系統 » androidwebview修改

androidwebview修改

發布時間: 2022-10-29 17:04:11

『壹』 關於Android WebView的那些事

[TOC]

Webkit是一個開源瀏覽器項目,其中,對Android開發者來說,或多或少的都有些接觸。 在應用層來看,最經常使用無非這么幾個類:WebView(Android中最為復雜,也是最為簡單的一個View,繼承自AbsoluteLayout),WebViewClient、WebChromeClient(作為回調控制類)、WebSettings(進行設置項的配置)等;Webkit內部包含了網路請求、頁面渲染、Js引擎等等。在Android4.4之前的版本中,系統使用的是Webkit內核,其後,切換到Google的Chromium內核。本文主要介紹的是在Android中,如何使用Webkit進行H5頁面的展現,以及常見問題的分析手段。

下面的內容抄自網路 & 亂七八糟的地方,簡單了解一下。

<b><i>前面都是吹牛逼的信息,如何使用Webkit來更好的搬磚? 且聽如下分解</i></b>

XML布局中丟一個 <WebView> 標簽,然後再 Activity 或者 Fragment 中 findViewById ,進而 loadUrl ,一般也沒人這么簡單的用,除非寫Demo。很簡單,它就是一個Layout,提供了一個調用載入頁面的介面,不寫範例了,能看到這篇文章的都看過Google的API說明。

主要涉及到WebView和WebSettings兩個類。

例如:

其實就是WebView的父類ViewGroup和View的方法,不多說了。不過需要注意的是,不是所有的View或ViewGroup的方法對WebView都生效。

列舉幾類常用的,幾乎所有App的 WebView 都會設置的屬性:

</br>

如何處理頁面跳轉以及特殊 Scheme

這個回調可以說是最容易出問題的一個回調,表示什麼? 字面意思,讓你重寫這個URL 的loading,比如點擊html打電話的一個 <a href=「tel:110」> 標簽,作為一個有節操、有責任心的瀏覽器,你需要處理 H5常用的幾個Scheme :

除此之外,還有各個應用自定義的scheme ,舉個例子,支付寶的支付Scheme : alipay: 。 這里的返回值,就代表你有沒有能力處理這個url,沒有的話Webkit就默認處理了。
需要注意的是,這個回調的觸發的絕大多數情況是點擊頁面的 <a href="xxxx"> a標簽,在Android中 loadUrl("http://www..com") ,是不會回調的,為什麼不會回調,各位自行理解吧。

超鏈接 <a> 標簽怎麼寫: 點我
特別說下窗口常見的兩種打開方式:

針對單頁模式的WebView框架(所有的html窗口均使用同一個WebView實例),不需要關注target的。
如果作為一個成熟的瀏覽器框架的話,是需要支持Html、javaScript使用新窗口打開頁面,需要實現如下回調:

還有一個相關設置項: WebSettings.
此時,系統將不會再回調 shouldOverrideUrlLoading 。新窗口邏輯的具體實現機制,可以參考系統browser實現邏輯。

<b> 這里有個坑 </b>
Android 4.4版本 ,如果實現了onCreateWindow,也就是說頁面 <a> 標簽是這么寫的: <a href="http://www..com" target="_blank"> ,點擊此鏈接打開的新WebView窗口,此窗口中的url點擊,是不會觸發 shouldOverrideUrlLoading 。 這是剛替換成Chrominum內核出的一個bug。本人並沒在新版本上驗證是否已經修復。

另外,根據不同的Rom,底層實現是不一樣的,有的ROM會幫你處理各種調起scheme,也就是startActivity,有的ROM點一個url,就會拋一個intent出來,讓用戶選擇系統瀏覽器進行載入。

系統默認,提供了一個介面:

有什麼安全隱患呢?
戳這里

如果不知道Js怎麼寫, 請戳我

用PC的截圖意思一下,看出區別了吧。 這里確定、取消點擊以後就得調用 JsResult、JsPromptResult 的 confirm或者cancel。

因為安全問題,大一些的App Native與Js通信都不再用 WebView.addJavascriptInterface(Object) 了,都改用JsPrompt,因為JsPrompt中有message、有JsPromptResult可以返回給Js一些信息,所以橋選中了JsPrompt,另一個備選方案是JsConsole。

大體有這么幾種方式進行傳遞

具體方案實現時,多方面考慮使用何種方式。

還有一個比較牛逼的

系統源碼中均有方法注釋,怎麼用自己看吧。
那麼問題來了

查了下,只有這兩個相關的:
WebBackForwardList BackForwardList()
void clearHistory()
系統提供的關於歷史記錄的操作並不多,因為,不支持單條刪除啊,啊啊啊!
WebViewClient中,還有一個相關callback,當系統更新歷史記錄時回調:
void doUpdateVisitedHistory(WebView view, String url, boolean isReload)

<b>相關問題分析法:歷史棧回退錯誤的定位</b>

絕大多數回退錯誤是由於介面調用、回調中邏輯執行時序錯誤。
定位方法:利用 BackForwardList , doUpdateVisitedHistory 兩個介面在 loadUrl、onPageStart、onPageFinish 以及邏輯相關的地方調用,打log,查看歷史棧,這里注意下由於loarl是非同步的,需要考慮是否加延遲等等保證調用時機的准確。
本人曾經遇到一個問題:在WebChromeClient中的 JsPrompt回調中,直接進行WebView.goBack操作,結果發現WebView確實回退到上一個頁面,但是BackFowardList當前頁面的index未更新的問題,具體見另一個篇blog。

網上有很多關於WebView內存泄露的討論,據傳,老版本的WebView在展示大量圖片的時候,即使 WebView.destory() WebView=null ,也不會銷毀。
在新版本上,實際測試結果:compileSDKVersion 23 不會泄露。
一般,我們如何銷毀WebView比較保險?

這個問題好大。。。
暫時不介紹,另起blog進行說明。

解決方案:
實現回調 void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)

首先,提幾個需要注意的點:

個人歸納總結幾點:

step1 進入開發者模式,勾選「顯示布局邊界」;
step 2,回到你想查看的界面; step 3 假如內容區只有一層基本就是H5 WebView的,多個層級,就是Native。

看到左右圖的差異了吧。
還有另一種方法,RD屌絲們看這里,特別說明,這種方法不太適合瀏覽器。 (自有內核,可能會不準確)

好了,就介紹到這里,零零散散的幾年前寫的文章,第一篇blog,如有不對的地方,還懇請大家指正。

『貳』 android webview 怎麼更改a標簽裡面的數據

已經解決了 Uri.parse(url).getFragment(); 就可以拿到了,我來拿分了 哈哈哈

『叄』 android webview 怎麼更改a標簽或者獲得裡面的數據

Web與html交互分為2個部分:
1、 android端的webview控制,以及數據交互工具類
2、 html頁面的javascript
同樣,頁面交互是雙向的,所以有如下兩種操作:
1、 通過android應用程序,調用html頁面的javascript,完成修改html等操作。
2、 通過html頁面javascript調用android端工具類,達到html頁面數據回傳給android應用處理。

//與html頁面交互工具類
util = new WebFormUtil(this, webView);
//webview初始化
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();

『肆』 android webview-android的webview怎麼修改網頁字體顏色和背景

webView是一個類似於瀏覽器的組件,本身不能修改網頁字體和背景,你需要在html頁面裡面設置字體和背景,用css控制一下就可以了!

『伍』 android webview默認屏幕為中像素密度怎麼修改

webview中右下角的縮放按鈕能不能去掉
settings.setDisplayZoomControls(false);
//隱藏webview縮放按鈕
讓Webview載入的頁面居中顯示有我知道的幾種方法
第一種方法:
WebSettings
settings
=
webView.getSettings();
settings.setLayoutAlgori...

『陸』 android webview 怎麼更改a標簽或者獲得裡面的數據

Web與html交互分為2個部分:
1、 android端的webview控制,以及數據交互工具類
2、 html頁面的javascript
同樣,頁面交互是雙向的,所以有如下兩種操作:
1、 通過android應用程序,調用html頁面的javascript,完成修改html等操作。
2、 通過html頁面javascript調用android端工具類,達到html頁面數據回傳給android應用處理。

//與html頁面交互工具類
util = new WebFormUtil(this, webView);
//webview初始化
webView = (WebView) findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
//允許執行javascript語句
webSettings.setJavaScriptEnabled(true);
//允許允許插件
webSettings.setPluginsEnabled(true);
//html頁面大小自適應
webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);
//指定在html頁面中,javascript通過調用mtsinfo,來調用util工具類
webView.addJavascriptInterface(util, "mtsinfo");
webView.loadUrl("file://" + UNZIPDIR + "/" + index[indexId]);
//指定webview顯示規則
webView.setWebViewClient(new WebViewClientEmb());

public class WebViewClientEmb extends WebViewClient {
// 在WebView中而不是系統默認瀏覽器中顯示頁面
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
// 頁面載入前調用
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon){
super.onPageStarted(view, url, favicon);
}
// 頁面載入完成後調用
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
}

『柒』 android中的webview載入網頁只想顯示部分內容改怎麼做

你的部分內容是指什麼?我先說明下webview,它是依照你給的url載入了整個Html,所以你想顯示裡面的一部分是沒辦法的。如果你想說的顯示部分內容是指整個html的大小,那你可以設置webview的寬度和高度

『捌』 Android系統 WebView是什麼有什麼用

現在越來越多的APP都內置了Web網頁去載入視圖,也就是我們常說的Hybrid APP混合應用,市場上很多平台都是這樣做的,比如我們經常使用的淘寶、京東等電商平台。這些是如何實現的呢?在我們Android中有一個WebView組件,它就可以實現此類功能。它是Android中的原生UI控制項,主要用於在APP應用中方便地訪問遠程網頁或本地HTML資源,同時WebView也在Android中充當Java代碼和JS代碼之間交互的橋梁,實際上也可以將WebView看做一個功能最小化的瀏覽器。下面我們一起來看看WebView的一些常用的使用方法。

WebView是Android系統提供的一個能顯示網頁的系統控制項,它是一個特殊的View,同時也是一個ViewGroup,可以有很多其他子View。在Android 4.4以下(不包含4.4)系統WebView底層實現是採用WebKit內核,而在Android 4.4及其以上Google採用了Chromium內核作為系統WebView的底層內核支持。在這一變化中Android提供的WebView相關API並沒有發生較大變化,在4.4上也兼容低版本的API並且引進了少部分API。這里簡單介紹下基於Chromium的WebView和基於WebKit的WebView之間的差異,基於Chromium的Webview提供了更廣的HTML5、CSS3、JavaScript支持,在Android系統版本5.0上基於Chromium 37,WebView提供了絕大多數的HTML5特性支持,除此之外Chromium也支持遠程調試(Chrome DevTools)。WebKit JavaScript引起採用WebCore JavaScript在Android 4.4上換成了V8能直接提升JavaScript性能。

二、作用
1、顯示和渲染Web頁面
2、使用html文件(網路上或本地assets中)作為布局
3、可與JavaScript交互調用
註: WebView控制項功能強大,除了具有一般View的屬性和設置外,還可以對Url請求、頁面載入、渲染、頁面交互進行強大的處理。

『玖』 android webview 插入JS修改網頁內容

JS代碼:
//根據class名稱獲取div數組
function getClass(parent,sClass)
{
var aEle=parent.getElementsByTagName('div');
var aResult=[];
var i=0;
for(i<0;i<aEle.length;i++)
{
if(aEle[i].className==sClass)
{
aResult.push(aEle[i]);
}
};
return aResult;
}

function hideOther()
{
getClass(document,'nav-sides')[0].style.display='none';
getClass(document,'side-bar')[0].style.display='none';
getClass(document,'area-main')[0].style.display='none';
getClass(document,'home-foot')[0].style.display='none';
getClass(document,'enter')[0].style.display='none';
getClass(document,'crumb')[0].style.display='none';
getClass(document,'date-tab clearfix')[0].style.display='none';
document.getElementById('id_sidebar').style.display='none';
document.getElementById('top_nav').style.display='none';
document.getElementById('fix-personal').style.display='none';
document.getElementById('waterlogo').style.display='none';

getClass(document,'wrap')[0].style.minWidth=0;
getClass(document,'game')[0].style.paddingTop=0;
}

然後在WebViewClient的onPageFinished判斷url,載入我們的js代碼。
然後你的設置webview即可。

@Override
public void onPageFinished(WebView view, String url) {

if(url!=null && url.contains("/p/resource/weapon/iProctID/39")){

String fun="javascript:function getClass(parent,sClass) { var aEle=parent.getElementsByTagName('div'); var aResult=[]; var i=0; for(i<0;i<aEle.length;i++) { if(aEle[i].className==sClass) { aResult.push(aEle[i]); } }; return aResult; } ";

view.loadUrl(fun);

String fun2="javascript:function hideOther() {getClass(document,'nav-sides')[0].style.display='none'; getClass(document,'side-bar')[0].style.display='none'; getClass(document,'area-main')[0].style.display='none'; getClass(document,'home-foot')[0].style.display='none'; getClass(document,'enter')[0].style.display='none'; getClass(document,'crumb')[0].style.display='none';getClass(document,'date-tab clearfix')[0].style.display='none'; document.getElementById('id_sidebar').style.display='none'; document.getElementById('top_nav').style.display='none'; document.getElementById('fix-personal').style.display='none'; document.getElementById('waterlogo').style.display='none';getClass(document,'wrap')[0].style.minWidth=0;getClass(document,'game')[0].style.paddingTop=0;}";

view.loadUrl(fun2);

view.loadUrl("javascript:hideOther();");

}

super.onPageFinished(view, url);
}

『拾』 Android開發之WebView(一)配置&小技巧

背景:原生時間緊沒時間開發任務量大的任務,而前端又閑著打醬油

方案:原生+webview混合開發

缺點:對於比較復雜的頁面,webview在性能上力不從心;且與原生通信頻繁也增加了隱藏的工作量

優點:能自帶支持動態更新(js),能充分利用人力

webview是一個基於webkit引擎,展示web頁面的控制項。Android上的webview在低版本和高版本採用了不同的webkit版本內核,Android4.4(19)後直接使用了Chrome內核;WebView控制項功能強大,除了具有一般View的屬性和設置外,還可以對url請求,頁面載入,渲染,頁面交互進行強大的處理。一般來說webview可單獨使用,也可聯合其工具類一起使用

移動應用的主體是webview,主要以網頁語言編寫,穿插Native功能的Hybrid App開發類型。激活webview為活躍狀態,能正常執行網頁的響應;當webview 的頁面被失去焦點切換到後台不可見狀態onPause時,需要通知自己暫停所有的動作,比如DOM的解析,plugin的執行,JavaScript的執行等

1,顯示和渲染web頁面

2,直接使用本地assets或者網路上的html文件作為布局

3,可和JavaScript進行互相調用

1,直接在布局文件里寫死

2,動態添加進viewgroup中

註:不管以哪種方式,都必須注意webview的銷毀,否則可能會造成內存泄漏最終導致內存溢出crash

下面是WebView的一些常用的方法列舉,一些已經過時的方法未列出

下面是WebSettings的一些常用的方法列舉,一些已經過時的方法就沒有寫出來了

一般不管是動態生成還是xml寫死,只要處理好了引用持有問題,就能有效的避免內存泄漏;下面是我嘗試的方案,在工具類WebViewUtils.java里封裝好,在activity銷毀的時候調用

1,清除webview緩存和記錄

2,可以設置不啟用緩存

3,H5的一些控制項標簽不支持導致的白屏

4,xml啟用軟體加速

5,通過menifest的來配置,在目標webview的activity設置

解決方案:

解決方案:

解決方案:

上一篇: Flutter入門-01-工程創建&目錄介紹

熱點內容
百度雲zip怎麼解壓 發布:2025-02-01 16:31:59 瀏覽:562
pmc密碼是什麼意思 發布:2025-02-01 16:28:49 瀏覽:783
蘋果手錶和安卓手錶哪個好用 發布:2025-02-01 16:28:07 瀏覽:582
上海電信上傳 發布:2025-02-01 16:22:10 瀏覽:982
有什麼好的雙u主板配置 發布:2025-02-01 16:18:17 瀏覽:176
編程漩渦 發布:2025-02-01 16:01:51 瀏覽:328
司機會所訪問 發布:2025-02-01 15:54:11 瀏覽:780
家用電腦改成伺服器並讓外網訪問 發布:2025-02-01 15:30:23 瀏覽:354
javac工資 發布:2025-02-01 15:24:28 瀏覽:23
如何刪除伺服器登錄賬號 發布:2025-02-01 15:21:05 瀏覽:498