在Android系统中使用WebViewClient处理跳转URL的方法
前言
最近代码里和WebView有很多的交互,webview是android中的浏览器控件,这里主要介绍一下webview如何重载WebViewClient类来控制URL加载。
使用WebViewClient
使用WebViewClinet主要是继承WebViewClient父类,根据需要重写其中的方法,并在WebView中进行配置,示例代码如下:
webView=(WebView)findViewById(R.id.webview);
webView.setWebViewClient(newExampleWebViewClient());
privateclassExampleWebViewClientextendsWebViewClient{
@Override
publicvoidonReceivedSslError(WebViewview,SslErrorHandlerhandler,SslErrorerror){
handler.proceed();
}
@Override
publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
view.loadUrl(url);
returntrue;
}
@Override
publicvoidonPageFinished(WebViewview,Stringurl){
super.onPageFinished(view,url);
}
@Override
publicvoidonPageStarted(WebViewview,Stringurl,Bitmapfavicon){
super.onPageStarted(view,url,favicon);
}
@Override
publicvoidonLoadResource(WebViewview,Stringurl){
super.onLoadResource(view,url);
}
}
WebViewClient方法
1.shouldOverrideUrlLoading(WebViewview,Stringurl)
官方注释:GivethehostapplicationachancetotakeoverthecontrolwhenanewurlisabouttobeloadedinthecurrentWebView.IfWebViewClientisnotprovided,bydefaultWebViewwillaskActivityManagertochoosetheproperhandlerfortheurl.IfWebViewClientisprovided,returntruemeansthehostapplicationhandlestheurl,whilereturnfalsemeansthecurrentWebViewhandlestheurl.ThismethodisnotcalledforrequestsusingthePOST"method".
翻译:当一个新的url要在当前WebView进行加载的时候,这个方法给应用一个机会来控制url的处理。如果WebView没有setWebViewClient,则默认操作是WebView将询问ActivityManager获取合适的handler处理url。如果WebView设置了setWebViewClient,返回true代表当前应用来处理url,返回false则代表当前webview来处理url。如果http请求是POST方法,该方法将不会被调用。
代码示例:
/**
*所有以www.example.com开头的url调用系统浏览器打开其他的url在当前webview打开
*/
@Override
publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
if(url.indexOf("http://www.example.com")!=-1){
//调用系统默认浏览器处理url
view.stopLoading();
view.getContext().startActivity(newIntent(Intent.ACTION_VIEW,Uri.parse(url)));
returntrue;
}
returnfalse;
}
2.shouleOverrideKeyEvent(WebViewview,KeyEventevent)
官方注释:Givethehostapplicationachancetohandlethekeyeventsynchronously.e.g.menushortcutkeyeventsneedtobefilteredthisway.Ifreturntrue,WebViewwillnothandlethekeyevent.Ifreturnfalse,WebViewwillalwayshandlethekeyevent,sononeofthesuperintheviewchainwillseethekeyevent.Thedefaultbehaviorreturnsfalse.
翻译:给当前应用一个机会来异步处理按键事件。返回true,WebView将不会处理该按键事件,返回false,WebView将处理该按键事件。默认返回是false。
3.onPageStarted(WebViewview,Stringurl,Bitmapfavicon)和onPageFinished(WebViewview,Stringurl)
官方注释:Notifythehostapplicationthatapagehasstartedloading.ThismethodiscalledonceforeachmainframeloadsoapagewithiframesorframesetswillcallonPageStartedonetimeforthemainframe.ThisalsomeansthatonPageStartedwillnotbecalledwhenthecontentsofanembeddedframechanges,i.e.clickingalinkwhosetargetisaniframe.
翻译:当页面开始加载时被调用。但是,当页面被嵌套时(例如iframe里有一个链接跳转),该方法将不会被调用。(今天就遇到了这种情况,可以通过重载onLoadResource来控制url跳转)
官方注释:Notifythehostapplicationthatapagehasfinishedloading.Thismethodiscalledonlyformainframe.WhenonPageFinished()iscalled,therenderingpicturemaynotbeupdatedyet.TogetthenotificationforthenewPicture,useonNewPicture(WebView,Picture).
翻译:在页面加载结束时被调用。
代码示例:
//获取页面加载时间
privatelongstartTime;
privatelongendTime;
privatelongspendTime;
@Override
publicvoidonPageFinished(WebViewview,Stringurl){
endTime=System.currentTimeMillis();
spendTime=endTime-startTime;
Toast.makeText(view.getContext(),"spendtimeis:"+spendTime,Toast.LENGTH_SHORT).show();
}
@Override
publicvoidonPageStarted(WebViewview,Stringurl,Bitmapfavicon){
startTime=System.currentTimeMillis();
}
4.onLoadResource(WebViewview,Stringurl)
官方注释:NotifythehostapplicationthattheWebViewwillloadtheresourcespecifiedbythegivenurl.
翻译:通知应用程序WebView将要加载指定url的资源,每一个资源(例如图片,嵌套url,js,css文件)。(可以通过该方法处理iframe嵌套的url)
代码示例:
@Override
publicvoidonLoadResource(WebViewview,Stringurl){
if(url.indexOf("http://www.example.com")!=-1&&view!=null){
view.stopLoading();
view.getContext().startActivity(newIntent(Intent.ACTION_VIEW,Uri.parse(url)));
}
}