
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
前言:生活的艱難,更會激發對夢想的渴望,但艱難的生活卻往往會成為夢想的絆腳石
相關文章:
1、《WebView使用詳解(一)——Native與JS相互調用(附JadX反編譯)》
2、《WebView使用詳解(二)——WebViewClient與常用事件監聽》
3、《WebView使用詳解(三)——WebChromeClient與LoadData補充》
上篇給大家簡單講了Webview中Native代碼與JS相互調用的方法,這篇我們再講講有關各種攔截與處理的東東。
一、WebViewClient
1、概述
前面我們雖然實現了交互,但可能我們會有一個很簡單的需求,就是在開始加載網頁的時候顯示進度條,加載結束以后隱藏進度條,這要怎么做?這些簡單的需求,Android開發的老人們肯定都已經想到了,這些有關各種事件的回調都被封裝在WebViewClient類中了,在WebViewClient中有各種的回調方法,就是在某個事件發生時供我們監聽
使用方法如下:
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- Log.d(TAG,"onPageStarted");
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
- Log.d(TAG,"onPageFinished");
- }
- });
2、WebViewClient中函數概述
在WebViewClient中除了上面我們列舉出的onPageStarted、onPageFinished還有很多其它函數,分別是:- /**
- * 在開始加載網頁時會回調
- */
- public void onPageStarted(WebView view, String url, Bitmap favicon)
- /**
- * 在結束加載網頁時會回調
- */
- public void onPageFinished(WebView view, String url)
- /**
- * 攔截 url 跳轉,在里邊添加點擊鏈接跳轉或者操作
- */
- public boolean shouldOverrideUrlLoading(WebView view, String url)
- /**
- * 加載錯誤的時候會回調,在其中可做錯誤處理,比如再請求加載一次,或者提示404的錯誤頁面
- */
- public void onReceivedError(WebView view, int errorCode,String description, String failingUrl)
- /**
- * 當接收到https錯誤時,會回調此函數,在其中可以做錯誤處理
- */
- public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error)
- /**
- * 在每一次請求資源時,都會通過這個函數來回調
- */
- public WebResourceResponse shouldInterceptRequest(WebView view,
- String url) {
- return null;
- }
3、WebViewClient之onPageStarted與onPageFinished
onPageStarted:通知主程序頁面當前開始加載。該方法只有在加載main frame時加載一次,如果一個頁面有多個frame,onPageStarted只在加載main frame時調用一次。也意味着若內置frame發生變化,onPageStarted不會被調用,如:在iframe中打開url鏈接。onPageFinished:通知主程序頁面加載結束。方法只被main frame調用一次。
我們就利用上面的想法來舉個例子:開始加載時顯示加載圓圈,結束加載時隱藏加載圓圈
- public class MyActivity extends Activity {
- private WebView mWebView;
- private ProgressDialog mProgressDialog;
- private String TAG = "qijian";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mWebView = (WebView)findViewById(R.id.webview);
- mProgressDialog = new ProgressDialog(this);
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.loadUrl("http://blog.csdn.net/harvic880925");
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- mWebView.loadUrl(url);
- return true;
- }
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- mProgressDialog.show();
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
- mProgressDialog.hide();
- }
- });
- }
- }

從效果圖中可以明顯看出,在加載頁面的時候會顯示圓形加載框,在加載成功以后會隱藏加載框。
4、WebViewClient之shouldOverrideUrlLoading
該函數的完整聲明如下:
- public boolean shouldOverrideUrlLoading(WebView view, String url)
返回值是boolean類型,表示是否屏蔽WebView繼續加載URL的默認行為,因為這個函數是WebView加載URL前回調的,所以如果我們return true,則WebView接下來就不會再加載這個URL了,所有處理都需要在WebView中操作,包含加載。如果我們return false,則系統就認為上層沒有做處理,接下來還是會繼續加載這個URL的。WebViewClient默認就是return false的:
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- return false;
- }
(1)、如何在WebView中加載在線網址
在上一篇中,我們提到,如果要在WebView中加載在線網址,必須重寫WebViewClient現在網上鋪天蓋地的都是重寫shouldOverrideUrlLoading來將URL加載進WebView,但在用多了WebView以后會發現,直接下面這樣寫,就可以實現在WebVIew中加載網頁:
- public class MyActivity extends Activity {
- private WebView mWebView;
- private ProgressDialog mProgressDialog;
- private String TAG = "qijian";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mWebView = (WebView)findViewById(R.id.webview);
- mProgressDialog = new ProgressDialog(this);
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.setWebViewClient(new WebViewClient());
- mWebView.loadUrl("http://blog.csdn.net/harvic880925");
- }
- }

從效果圖中可以看出即僅僅設置WebViewClient對象,使用它的默認回調就可以實現在WebView中加載在線URL了:
- mWebView.setWebViewClient(new WebViewClient());
(2)、shouldOverrideUrlLoading用途
由於每次超鏈接在加載前都會先走shouldOverrideUrlLoading回調,所以我們如果想攔截某個URL,將其轉換成其它URL可以在這里做。比如,我們攔截所有包含“blog.csdn.net”的地址,將其替換成”www.baidu.com”:
效果圖如下:

代碼如下:
- public class MyActivity extends Activity {
- private WebView mWebView;
- private ProgressDialog mProgressDialog;
- private String TAG = "qijian";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mWebView = (WebView)findViewById(R.id.webview);
- mProgressDialog = new ProgressDialog(this);
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- if (url.contains("blog.csdn.net")){
- view.loadUrl("http://www.baidu.com");
- }else {
- view.loadUrl(url);
- }
- return true;
- }
- });
- mWebView.loadUrl("http://blog.csdn.net/harvic880925");
- }
- }
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- if (url.contains("blog.csdn.net")){
- view.loadUrl("http://www.baidu.com");
- }else {
- view.loadUrl(url);
- }
- return true;
- }
這里需要非常注意的是:如果我們在shouldOverrideUrlLoading中return true,就表示告訴系統我們已經攔截了URL並做處理,不需要再觸發系統默認的行為()在WebView中加載URL;所以對於其它URL我們需要在else里重新調用view.loadUrl(url)來加載;不然WebView將會白屏,因為這個URL根本就沒有加載進WebView,在shouldOverrideUrlLoading這就被我們攔截掉了。
那么問題來了,在我們return true了以后,WebView還會請求網絡嗎?我們來抓下請求:

從請求中可以看到,我們雖然攔截了”http://blog.csdn.net/harvic880925“但是仍然還是會請求網絡的。只是請求以后結果並沒有通過WebView加載。
那問題來了,如果我們return false呢,如果我們return false的話,是不需要else語句的,因為系統默認會加載這個URL,所以上面的語句與下面的意義相等:
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- if (url.contains("blog.csdn.net")){
- view.loadUrl("http://www.baidu.com");
- }
- return false;
- }
- }
所以結論來了:
在利用shouldOverrideUrlLoading來攔截URL時,如果return true,則會屏蔽系統默認的顯示URL結果的行為,不需要處理的URL也需要調用loadUrl()來加載進WebVIew,不然就會出現白屏;如果return false,則系統默認的加載URL行為是不會被屏蔽的,所以一般建議大家return false,我們只關心我們關心的攔截內容,對於不攔截的內容,讓系統自己來處理即可。
5、WebViewClient之onReceivedError
onReceivedError的完整聲明如下:
- public void onReceivedError(WebView view, int errorCode,String description, String failingUrl)
這里有四個參數:
- WebView view:當前的WebView實例
- int errorCode:錯誤碼
- String description:錯誤描述
- String failingUrl:當前出錯的URL
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <h1 id="h">啊哈,出錯了……</h1>
- </body>
- </html>
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
- super.onReceivedError(view, errorCode, description, failingUrl);
- mWebView.loadUrl("file:///android_asset/error.html");
- }
- });

6、WebViewClient之onReceivedSslError
我們知道HTTPS協議是通過SSL來通信的,所以當使用HTTPS通信的網址(以https://開頭的網站)出現錯誤時,就會通過onReceivedSslError回調通知過來,它的函數聲明為:
- /**
- * 當接收到https錯誤時,會回調此函數,在其中可以做錯誤處理
- */
- public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error)
- WebView view:當前的WebView實例
- SslErrorHandler handler:當前處理錯誤的Handler,它只有兩個函數SslErrorHandler.proceed()和SslErrorHandler.cancel(),SslErrorHandler.proceed()表示忽略錯誤繼續加載,SslErrorHandler.cancel()表示取消加載。在onReceivedSslError的默認實現中是使用的SslErrorHandler.cancel()來取消加載,所以一旦出來SSL錯誤,HTTPS網站就會被取消加載了,如果想忽略錯誤繼續加載就只有重寫onReceivedSslError,並在其中調用SslErrorHandler.proceed()
- SslError error:當前的的錯誤對象,SslError包含了當前SSL錯誤的基本所有信息,大家自己去看下它的方法吧,這里就不再展開了。
示例(1)、默認加載SSL出錯的網站——出現空白頁面
我們先舉個例子來看下默認情況下加載SSL有錯的網站,WebView的表現是怎樣的:(12306是通過Https協議來傳輸的,但是它的SSL證書是有問題的,所以我們就以12306網站為例)- public class MyActivity extends Activity {
- private WebView mWebView;
- private ProgressDialog mProgressDialog;
- private String TAG = "qijian";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mWebView = (WebView)findViewById(R.id.webview);
- mProgressDialog = new ProgressDialog(this);
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
- super.onReceivedSslError(view, handler, error);
- Log.e(TAG,"sslError:"+error.toString());
- }
- mWebView.loadUrl("https://www.12306.cn/");
- }
- }

錯誤日志如下:
示例(2)、使用SslErrorHandler.proceed()來繼續加載
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
- // 一定要注釋掉!
- // super.onReceivedSslError(view, handler, error);
- handler.proceed();
- Log.e(TAG,"sslError:"+error.toString());
- }
- });
第一:注釋掉super.onReceivedSslError(view, handler, error);,取消系統的默認行為,我們看源碼,可以發現在WebViewClient中onReceivedSslError的默認實現是這樣的:
- public void onReceivedSslError(WebView view, SslErrorHandler handler,
- SslError error) {
- handler.cancel();
- }
第二:調用handler.proceed();來忽略錯誤繼續加載頁面。
所以此時的效果圖為:

示例(3):在SSL發生錯誤時,onReceivedError會被回調嗎?——不會
大家可能還有一個疑問:當SSL發生錯誤時,我們說會回調onReceivedSslError,我們前面還說了一個出錯時會回調的函數:onReceivedError,那么問題來了,當出現SSL錯誤時onReceivedError會被回調嗎?答案是不會的,我們來做個實驗:
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
- // super.onReceivedSslError(view, handler, error);
- handler.proceed();
- Log.e(TAG,"sslError:"+error.toString());
- }
- @Override
- public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
- super.onReceivedError(view, errorCode, description, failingUrl);
- Log.e(TAG,"onReceivedError:"+errorCode+" "+description);
- }
- });
在代碼中我們同時使用onReceivedSslError和onReceivedError來接收錯誤,看下在出錯時,哪個函數中會打出LOG,結果的日志如下:
從日志中明顯可以看出,只有onReceivedSslError的接收日志,所以在SSL出錯時,是不會觸發onReceivedError回調的
所以對於onReceivedSslError結論來了:
當出現SSL錯誤時,WebView默認是取消加載當前頁面,只有去掉onReceivedSslError的默認操作,然后添加SslErrorHandler.proceed()才能繼續加載出錯頁面
當HTTPS傳輸出現SSL錯誤時,錯誤會只通過onReceivedSslError回調傳過來
7、WebViewClient之shouldInterceptRequest
在每一次請求資源時,都會通過這個函數來回調,比如超鏈接、JS文件、CSS文件、圖片等,也就是說瀏覽器中每一次請求資源時,都會回調回來,無論任何資源!但是必須注意的是shouldInterceptRequest函數是在非UI線程中執行的,在其中不能直接做UI操作,如果需要做UI操作,則需要利用Handler來實現,該函數聲明如下:
- public WebResourceResponse shouldInterceptRequest(WebView view,
- String url) {
- return null;
- }
利用這個特性,我們可以解決一個需求:假如網頁中需要加載本地的圖片,我們就可以通過攔截shouldInterceptRequest,並返回結果即可
比如下面的一段HTML代碼中,img字段加載圖片的地址是:http://localhost/qijian.png,這是我自定義的一個網址,在Android中,當發現要加載這個地址的資源時,我們將它換成本地的圖片
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <h1 id="h">歡迎光臨啟艦的blog</h1>
- <img src="http://localhost/qijian.png"/>
- </body>
- </html>
- public class MyActivity extends Activity {
- private WebView mWebView;
- private ProgressDialog mProgressDialog;
- private String TAG = "qijian";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mWebView = (WebView)findViewById(R.id.webview);
- mProgressDialog = new ProgressDialog(this);
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.setWebViewClient(new WebViewClient(){
- @Override
- public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
- try {
- if (url.equals("http://localhost/qijian.png")) {
- AssetFileDescriptor fileDescriptor = getAssets().openFd("s07.jpg");
- InputStream stream = fileDescriptor.createInputStream();
- WebResourceResponse response = new WebResourceResponse("image/png", "UTF-8", stream);
- return response;
- }
- }catch (Exception e){
- Log.e(TAG,e.getMessage());
- }
- return super.shouldInterceptRequest(view, url);
- }
- });
- mWebView.loadUrl("file:///android_asset/web.html");
- }
結果圖如下:

7、WebViewClient之其余函數
上面講了常用的大部分函數,還些一些函數,並不怎么用,這里由於篇幅有限就不再講了,把函數聲明和作用列出來供大家參考
- /**
- * 在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次
- */
- public void onLoadResource(WebView view, String url)
- /**
- * (WebView發生改變時調用)
- * 可以參考http://www.it1352.com/191180.html的用法
- */
- public void onScaleChanged(WebView view, float oldScale, float newScale)
- /**
- * 重寫此方法才能夠處理在瀏覽器中的按鍵事件。
- * 是否讓主程序同步處理Key Event事件,如過濾菜單快捷鍵的Key Event事件。
- * 如果返回true,WebView不會處理Key Event,
- * 如果返回false,Key Event總是由WebView處理。默認:false
- */
- public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)
- /**
- * 是否重發POST請求數據,默認不重發。
- */
- onFormResubmission(WebView view, Message dontResend, Message resend)
- /**
- * 更新訪問歷史
- */
- doUpdateVisitedHistory(WebView view, String url, boolean isReload)
- /**
- * 通知主程序輸入事件不是由WebView調用。是否讓主程序處理WebView未處理的Input Event。
- * 除了系統按鍵,WebView總是消耗掉輸入事件或shouldOverrideKeyEvent返回true。
- * 該方法由event 分發異步調用。注意:如果事件為MotionEvent,則事件的生命周期只存在方法調用過程中,
- * 如果WebViewClient想要使用這個Event,則需要復制Event對象。
- */
- onUnhandledInputEvent(WebView view, InputEvent event)
- /**
- * 通知主程序執行了自動登錄請求。
- */
- onReceivedLoginRequest(WebView view, String realm, String account, String args)
- /**
- * 通知主程序:WebView接收HTTP認證請求,主程序可以使用HttpAuthHandler為請求設置WebView響應。默認取消請求。
- */
- onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
- /**
- * 通知主程序處理SSL客戶端認證請求。如果需要提供密鑰,主程序負責顯示UI界面。
- * 有三個響應方法:proceed(), cancel() 和 ignore()。
- * 如果調用proceed()和cancel(),webview將會記住response,
- * 對相同的host和port地址不再調用onReceivedClientCertRequest方法。
- * 如果調用ignore()方法,webview則不會記住response。該方法在UI線程中執行,
- * 在回調期間,連接被掛起。默認cancel(),即無客戶端認證
- */
- onReceivedClientCertRequest(WebView view, ClientCertRequest request)<span style="color:#006600;">
- </span>
二、其它事件處理
上面講了有關WebViewClient的用法,但其中還有一些小問題是WebViewClient無法解決的,比如返回按鍵、滾動事件監聽等,下面我們就這些問題來跟大家做下探討1、返回按鍵
如果用webview點鏈接看了很多頁以后,如果不做任何處理,點擊系統“Back”鍵,整個瀏覽器會調用finish()而結束自身,如果希望瀏覽的網頁回退而不是退出瀏覽器,需要在當前Activity中處理並消費掉該Back事件。 覆蓋Activity類的onKeyDown(int keyCoder,KeyEvent event)方法。- public class MyActivity extends Activity {
- private WebView mWebView;
- private ProgressDialog mProgressDialog;
- private String TAG = "qijian";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mWebView = (WebView)findViewById(R.id.webview);
- mProgressDialog = new ProgressDialog(this);
- mWebView.getSettings().setJavaScriptEnabled(true);
- mWebView.setWebViewClient(new WebViewClient());
- mWebView.loadUrl("http://blog.csdn.net/harvic880925/");
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- //改寫物理返回鍵的邏輯
- if(keyCode==KeyEvent.KEYCODE_BACK) {
- if(mWebView.canGoBack()) {
- mWebView.goBack();//返回上一頁面
- return true;
- } else {
- System.exit(0);//退出程序
- }
- }
- return super.onKeyDown(keyCode, event);
- }
- }

重寫onKeyDown后的效果圖:
可見在重寫onKeyDown后,點擊回退按鈕時,就會回退到WebView的上一個頁面。
2、滾動事件監聽
我們都知道監聽滾動事件一般都是設置setOnScrollChangedListener,可惜的是 WebView並沒有給我們提供這樣的方法,但是我們可以重寫WebView,覆蓋里面的一個方法: protected void onScrollChanged(final int l, final int t, final int oldl,final int oldt){} 然后再對外提供一個接口,示例代碼如下:
- public class MyWebView extends WebView {
- private OnScrollChangedCallback mOnScrollChangedCallback;
- public MyWebView(Context context) {
- super(context);
- }
- public MyWebView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public MyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- }
- @Override
- protected void onScrollChanged(int l, int t, int oldl, int oldt) {
- super.onScrollChanged(l, t, oldl, oldt);
- if (mOnScrollChangedCallback != null) {
- mOnScrollChangedCallback.onScroll(l,t,oldl,oldt);
- }
- }
- public OnScrollChangedCallback getOnScrollChangedCallback() {
- return mOnScrollChangedCallback;
- }
- public void setOnScrollChangedCallback(
- final OnScrollChangedCallback onScrollChangedCallback) {
- mOnScrollChangedCallback = onScrollChangedCallback;
- }
- public static interface OnScrollChangedCallback {
- public void onScroll(int left,int top ,int oldLeft,int oldTop);
- }
- }
3、如何強制使用外部瀏覽器打開網頁
如果不想在 webview 中顯示網頁,而是直接跳轉到瀏覽器的話,可以像下邊那樣調用。- Uri uri = Uri.parse("http://www.example.com");
- Intent intent = new Intent(Intent.ACTION_VIEW, uri);
- startActivity(intent);
《intent詳解(一)》
《intent詳解(二)》
好了,這篇文章就到這里了,下篇文章給大家繼續講解有關WebView的知識。
如果本文有幫到你,記得加關注哦
源碼下載地址:http://download.csdn.net/detail/harvic880925/9534186
請大家尊重原創者版權,轉載請標明出處:http://blog.csdn.net/harvic880925/article/details/51523983 謝謝
如果你喜歡我的文章,那么你將會更喜歡我的微信公眾號,將定期推送博主最新文章與收集干貨分享給大家(一周一次)
- 頂
- 24
- 踩
- 0
-
我的新浪微博
-
交流群來啦
QQ群號一(已滿):304235209
QQ群號二:554244703
博主需要你!!!
我的微信公眾號
-
關注博主最新動態和干貨分享,一周一次

-
下面是我做IT技術面試輔導的公眾號,旨在為大家提供技術面試相關的資料與支持

-
博客專欄
![]() |
《Animation動畫詳解》 文章:13篇 閱讀:236559 |
-
文章分類
- ---------windows相關---------(0)
- 1、C++/VC++相關(4)
- -------1.1 C++基礎學習心得(7)
- -------1.2 MFC類的使用心得(12)
- -------1.3數據庫相關(0)
- ------------1.3.1 數據庫操作(7)
- -----------1.3.2 mysql(2)
- -------1.4 COM操作(1)
- -------1.5 線程(2)
- -------1.6 socket(6)
- -------1.7 excel操作(2)
- -------1.8 WIN32(30)
- 2、界面開發(3)
- -------2.1 MFC 界面美化(9)
- -------2.2 directUI(5)
- -------2.3 Duilib(5)
- -------2.4 GDI+(18)
- 3、視頻開發(3)
- -------3.1 directShow(2)
- -------3.2 FFMPEG(1)
- -------3.3 openCV(1)
- 4、PHP & B/S(0)
- -------4.1 PHP 相關(0)
- --------------4.1.1 PHP(10)
- --------------4.1.2 zend(2)
- ---------4.2 HTML相關(0)
- --------------4.2.1 HTML(1)
- --------------4.2.2 CSS(3)
- -------4.3 JS/JQuery(2)
- --------------4.3.1 JS(9)
- --------------4.3.2 JQuery(9)
- --------------4.3.2 JQueryUI(1)
- 5、andriod開發(149)
- 6、數據結構/算法(0)
- -------6.1 數據結構(2)
- 7、面試(0)
- -------7.1 面試(2)
- 8、C#(1)
- 9、其它(4)
- -------9.1 Grid++Report(1)
- linux(2)
-
閱讀排行
- EventBus使用詳解(一)——初步使用EventBus(312214)
- PullToRefresh使用詳解(一)--構建下拉刷新的listView(151320)
- ViewPager 詳解(一)---基本入門(146810)
- android sdk離線安裝(126186)
- EventBus使用詳解(二)——EventBus使用進階(97926)
- ViewPager 詳解(二)---詳解四大函數(81159)
- 獲取Android簽名證書的sha1值(79898)
- ViewPager 詳解(五)-----使用Fragment實現ViewPager滑動(79366)
- PopUpWindow使用詳解(一)——基本使用(72872)
- 自定義控件三部曲之動畫篇(一)——alpha、scale、translate、rotate、set的xml屬性及用法(72647)
-
評論排行
- android sdk離線安裝(150)
- EventBus使用詳解(一)——初步使用EventBus(126)
- EventBus使用詳解(二)——EventBus使用進階(83)
- 自定義控件之繪圖篇(四):canvas變換與操作(77)
- ViewPager 詳解(一)---基本入門(76)
- ViewPager 詳解(二)---詳解四大函數(69)
- 自定義控件三部曲之動畫篇(一)——alpha、scale、translate、rotate、set的xml屬性及用法(59)
- PullToRefresh使用詳解(一)--構建下拉刷新的listView(59)
- 自定義控件三部曲之繪圖篇(六)——Path之貝賽爾曲線和手勢軌跡、水波紋效果(57)
- ViewPager 詳解(四)----自主實現滑動指示條(54)
-
最新評論
- 自定義控件三部曲之繪圖篇(九)——Paint之setColorFilter
志先生_: 感覺從10章往后都好難理解看好幾遍都有些看不懂,這大約是幾年的工作的水平才能看懂啊。
- SpannableString與SpannableStringBuilder
Mr_Snoopy: @qq_38106356:我也想這么處理,修改一部分,其他部分不變化,有解決方法了嗎
- 自定義控件三部曲之動畫篇(四)——ValueAnimator基本使用
野比大雄-蝸牛: 寫的實在是太好啦,現在你的每一篇博客都在挨個看了。多謝啊
- Fragment詳解之六——如何監聽fragment中的回退事件與怎樣保存fragment狀態
qugengting: @harvic880925:剛好適用我的項目,一個activity只包含一個fragment哈哈
- 自定義控件三部曲之繪圖篇(六)——Path之貝賽爾曲線和手勢軌跡、水波紋效果
志先生_: 為什么要通過lineTo將波浪閉合起來 呢?
- 自定義控件三部曲之繪圖篇(六)——Path之貝賽爾曲線和手勢軌跡、水波紋效果
志先生_: 動畫的本質也是在子線程里運行的還是在UI線程感覺運行時UI有些卡頓是什么原因呢?
- WebView使用詳解(二)——WebViewClient與常用事件監聽
bruce_lv: mWebView.setWebViewClient(new WebViewClient(){ ...
- 自定義控件之繪圖篇(二):路徑及文字
月光世界: 多謝樓主,很好的一篇文章
- android---xml---include用法(導入另一個XML文件到本布局中)
RKGG愛吃魚: 那如何調用include導入的子布局的控件呢?能不能在寫一個子布局的View類,實現調用更新控件的功...
- Android自定義控件三部曲文章索引
corffen: 博主,還更新嗎?
此時除了請求baidu還會請求CSDN嗎?
假如JS中返回按鈕直接調用了系統window.histroy(-1)
這個時候,webview能監聽到這個信號嗎
樓主好棒!!!!
WebResourceResponse response = new WebResourceResponse("image/png", "UTF-8", stream);
return response;
如果我想用一個URL網址替換原本要將要打開的URL網址怎么辦呢?
WebResourceResponse response = new WebResourceResponse("image/png", "UTF-8", stream);
return response;
如果我是想用一個網絡上的圖片或網頁地址替換原有URL怎么做呢?而不是從本地讀一個文件出來替換。