在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))); } }