Android WebView拦截iframe标签内部跳转教程
最近项目里有个广告位需要动态配置,后台给了一段html嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理。
比如,下面是一段html代码,嵌套这iframe标签,src就是跳转地址,我现在就要当你点击该网址的时候做拦截,自己做处理而不是跳转。
oh,我还是第一次知道iframe标签,不过想着应该和普通拦截h5差不多,兴致勃勃的就开始撸代码了,但是无论怎么配置WebView,还是重写shouldOverrideUrlLoading,就是拦截不了iframe里的网址。。。后来研(bai)究(du)了很久,终于拦截到了。
实现方法:
首先,你的WebView要setWebViewClient,重写
publicbooleanshouldOverrideUrlLoading(WebViewview,WebResourceRequestrequest){}方法,然后setWebChromeClient,重写onCreateWindow方法,在里面创建新的WevView,加入到webView里,给新的webViewsetWebViewClient,再重写shouldVeerrideUrlLoading方法,在这里拦截。
webView.setWebChromeClient(newWebChromeClient(){
@Override
publicbooleanonCreateWindow(WebViewwebView,booleanisDialog,booleanisUserGesture,MessageresultMsg){
WebViewnewWebView=newWebView(getActivity());
webView.addView(newWebView);
WebView.WebViewTransporttransport=(WebView.WebViewTransport)resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
newWebView.setWebViewClient(newWebViewClient(){
@Override
publicbooleanshouldOverrideUrlLoading(WebViewwebView,Stringurl){
//TODO在这里实现你的拦截方法
if(url.contains("https://www.nhooo.com")){
toast("拦截到了"+url);
Intentintent=newIntent(getActivity(),CommonWebViewActivity.class);
intent.putExtra("url",url);
startActivity(intent);
}else{
webView.loadUrl(url);
}
returntrue;
}
});
returntrue;
}
});
完整的代码如下:
privatevoidinitWebView(WebViewwebView){
//启用支持javascript
WebSettingssettings=webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setSupportZoom(false);//支持缩放
settings.setBuiltInZoomControls(false);//支持手势缩放
settings.setDisplayZoomControls(false);//是否显示缩放按钮
settings.setDefaultTextEncodingName("utf-8");//设置文本编码
settings.setUseWideViewPort(false);//将图片调整到适合WebView的大小
settings.setLoadWithOverviewMode(true);//自适应屏幕
settings.setDomStorageEnabled(true);
settings.setSaveFormData(true);
settings.setSupportMultipleWindows(true);
settings.setAppCacheEnabled(true);
settings.setPluginState(WebSettings.PluginState.ON);//支持插件
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不适用缓存
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//支持内容重新布局
webView.setOverScrollMode(View.OVER_SCROLL_NEVER);//取消WebView中滚动或拖动到顶部、底部时的阴影
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);//取消滚动条白边效果
//>=19(SDK4.4)启动硬件加速,否则启动软件加速
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
webView.setLayerType(View.LAYER_TYPE_HARDWARE,null);
settings.setLoadsImagesAutomatically(true);//支持自动加载图片
}else{
webView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
settings.setLoadsImagesAutomatically(false);
}
webView.setWebViewClient(newWebViewClient(){
@Override
publicvoidonLoadResource(WebViewview,Stringurl){
super.onLoadResource(view,url);
Log.w("webView==onLoadResource===url="+url);
}
@Override
publicvoidonReceivedSslError(WebViewwebView,SslErrorHandlersslErrorHandler,SslErrorsslError){
sslErrorHandler.proceed();//接受所有网站的证书
}
@Override
publicbooleanshouldOverrideUrlLoading(WebViewview,WebResourceRequestrequest){
if(request.getUrl().toString().contains("http://www.baidu.com")){
toast("拦截到了baidu");
}else{
webView.loadUrl(request.getUrl().toString());
}
returntrue;
}
});
webView.setWebChromeClient(newWebChromeClient(){
@Override
publicbooleanonCreateWindow(WebViewwebView,booleanisDialog,booleanisUserGesture,MessageresultMsg){
WebViewnewWebView=newWebView(getActivity());
webView.addView(newWebView);
WebView.WebViewTransporttransport=(WebView.WebViewTransport)resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
newWebView.setWebViewClient(newWebViewClient(){
@Override
publicbooleanshouldOverrideUrlLoading(WebViewwebView,Stringurl){
if(url.contains("//www.nhooo.com")){
toast("拦截到了"+url);
Intentintent=newIntent(getActivity(),CommonWebViewActivity.class);
intent.putExtra("url",url);
startActivity(intent);
}else{
webView.loadUrl(url);
}
returntrue;
}
});
returntrue;
}
});
}
以上这篇AndroidWebView拦截iframe标签内部跳转教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。