❶ android中,如何屏蔽WebView里的超鏈接
mWebView.setWebViewClient(new MyWebviewClient());
class MyWebviewClient extends WebViewClient{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
}
shouldOverrideUrlLoading 這個方法就是點擊網頁上的超鏈接的回調函數 按照我這樣做就沒問題了。
❷ Android activity中載入了webview,頁面跳轉後總是要點擊兩次手機的返回按鈕才能回到上一頁
WebViewClient中的shouldOverrideUrlLoading方法如下重寫:
java">@Override
(WebViewview,Stringurl)
{
view.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
view.loadUrl(url);
returnsuper.shouldOverrideUrlLoading(view,url);
}
onKeyDown如下重寫:
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent)
{
if(keyCode==KeyEvent.KEYCODE_BACK){
if(webView.canGoBack()){
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.goBack();
returntrue;
}else{
finish();
returntrue;
}
}
returnfalse;
}
❸ android webview這個坑貨-之一
android上webivew是個坑貨,無疑!以前就曾出現過好幾次莫名其妙的發出signal退出進程的例子,你退就退對應的activity就行了,為啥要把整個進程幹掉?這回遇到的是一個crash,基本都在8.x機器上,而且絕大部分都是華為和榮耀機器,比如DUB-AL00佔比三分之一。堆棧如下:
另外還有一個信息,crash的線程是在一個我用HandlerThread寫的後台處理線程類A,這個類調用的地方不多,大概七八處。
解決思路:
一、先復現
根據上報的機型model和日誌里的信息,發現是搜索某個特定的劇後crash的,找到相應的機器後,確實能復現,是個第三方的劇的網頁,進去後播放沒問題,但是如果做些點擊的操作就90%以上概率會crash,而且,同樣的8.x機器,非上報機型的華為或榮耀不能復現。
但是,同樣的機型,使用同樣sdk的公司內另一個app卻沒事。
二、可能性
對於1,嘗試各方面對齊另一個app後,未果,一樣crash。
對於2,找遍了各種調用方式上異同,比如傳參等,未果,一樣crash
那看起來是3了,但是不敢面對這個現實哈哈。
嘗試通過breadpad來恢復堆棧,不可行,沒有chrome的帶symbol的so庫。
想來想去,還是回到crash本身,為啥每次都在那個線程類A里,是上報系統不準還是確實和線程A有關,反正調用A的地方也不多,那索性都給注釋了,再試,果然沒問題,那接下來就簡單了挨個排除就行了,最後發現是在那個線程里會讀取剪貼板的地方有問題,不讀剪貼板就行了。回過頭看堆棧:
剛好可以對上,所以猜測,是非主線程里讀取了剪貼板了,導致webview在主線程里對剪貼板相關操作時崩潰,具體源碼沒去看了,有興趣的可以研究下。
嗯,其實一開始就應該把線程A和堆棧里的Clipboard聯想起來的。
解決方案:
線程A里調用剪貼板的地方,換成在主線程里調。
❹ android webview中的按鈕彈框無法點擊
webview 設置WebChromeClient
❺ Android webview 載入網頁,網頁中的雙擊事件失效,如何解決
webview 有沒有設置允許javascript腳本
加個屬性rel="external"試試
❻ android開發WebView怎麼禁用滑鼠滾輪事件
因為你禁掉了webview的滾輪事件,而在webview中你滑鼠滾輪事件是去調webview自己的,所以才沒有作用。
❼ 關於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,並實現一個Activity,用來接收外部的跳轉。代碼如下:
public class JumpActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String data = intent.getDataString();
System.out.println(data);
}
}
在這個Activity里,我們可以通過getIntent(),來獲取外部跳轉傳過來的信息。
修改ManiFest文件,設置Activity的接收Action的屬性,代碼如下:
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="data"
android:scheme="sharetest" />
</intent-filter>
如上所示,在data里設置了 scheme和host,則該Activity可以接收和處理類似於 "sharetest://data/XXX"的鏈接。
接下來我們可以寫一個測試工程B,看看工程A中的JumpActivity是否可以接收和處理類似於 "sharetest://data/XXX"的鏈接。因此,新建一個工程B,工程里只有一個WebView,用來打開一個本地的網頁。由於WebView在接收到自己不能處理的Uri時,會自動的調用發送Intent來調用能夠處理該Uri的應用。
以下是網頁的代碼:
<!DOCTYPE html>
<html>
<body>
<iframe src="sharetest://data/123" style="display:none"></iframe>
</body>
</html>
❾ webview怎樣禁止雙擊縮放
// 關閉縮放
webSettings.setBuiltInZoomControls(false);
webSettings.setSupportZoom(false);
webSettings.setDisplayZoomControls(false);
❿ android webview怎麼禁止縮放
要支持縮放,肯定要先支持JavaScript,加如下代碼:
//支持JS
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);123123
重點來了,要想支持縮放,要加如下代碼支持
//支持屏幕縮放
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);
我們怎樣去掉它呢,在Android3.0之後實現非常簡單,加一句代碼就可以了,如下代碼:
//不顯示webview縮放按鈕
settings.setDisplayZoomControls(false);
所以說,我們沒有必要兼容2.x了,就像iOS開發只兼容到IOS7版本就OK了,但是有的同學又說,我有強迫症,我就想兼容到2.x版本,其實解決方案網上都有了,這里用到了Java反射的知識,通過反射來獲取私有的屬性控制項mZoomButtonsController,然後就其setVisibility(View.GONE)隱藏就可以了,下面貼出代碼實現:
public void setZoomControlGone(View view){
Class classType;
Field field;
try {
classType = WebView.class;
field = classType.getDeclaredField("mZoomButtonsController");
field.setAccessible(true);
ZoomButtonsController mZoomButtonsController = new ZoomButtonsController(view);
mZoomButtonsController.getZoomControls().setVisibility(View.GONE);
try {
field.set(view, mZoomButtonsController);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}