最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理。
比如,下面是一段html代码,嵌套这iframe标签,src就是跳转地址,我现在就要当你点击该网址的时候做拦截,自己做处理而不是跳转。
1
2
3
4
|
< html > < iframe src = "http://www.tuohang.net/" frameborder = '0' scrolling = 'no' width = '100%' height = '300' > </ iframe > </ html > |
oh,我还是第一次知道iframe标签,不过想着应该和普通拦截h5差不多,兴致勃勃的就开始撸代码了,但是无论怎么配置WebView,还是重写 shouldOverrideUrlLoading ,就是拦截不了iframe里的网址。。。后来研(bai)究(du)了很久,终于拦截到了。
实现方法:
首先,你的WebView要 setWebViewClient ,重写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {} 方法,然后setWebChromeClient,重写onCreateWindow方法,在里面创建新的WevView,加入到webView里,给新的webView setWebViewClient,再重写shouldVeerrideUrlLoading方法,在这里拦截。 webView.setWebChromeClient( new WebChromeClient(){ @Override public boolean onCreateWindow(WebView webView, boolean isDialog, boolean isUserGesture, Message resultMsg) { WebView newWebView = new WebView(getActivity()); webView.addView(newWebView); WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; transport.setWebView(newWebView); resultMsg.sendToTarget(); newWebView.setWebViewClient( new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { //TODO 在这里实现你的拦截方法 if (url.contains( "http://www.tuohang.net" )){ toast( "拦截到了" + url); Intent intent = new Intent(getActivity(), CommonWebViewActivity. class ); intent.putExtra( "url" ,url); startActivity(intent); } else { webView.loadUrl(url); } return true ; } }); return true ; } }); |
完整的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
private void initWebView(WebView webView) { //启用支持javascript WebSettings settings = 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( new WebViewClient() { @Override public void onLoadResource(WebView view, String url) { super .onLoadResource(view, url); Log.w( "webView==onLoadResource===url=" + url); } @Override public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) { sslErrorHandler.proceed(); // 接受所有网站的证书 } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { if (request.getUrl().toString().contains( "http://www.baidu.com" )){ toast( "拦截到了baidu" ); } else { webView.loadUrl(request.getUrl().toString()); } return true ; } }); webView.setWebChromeClient( new WebChromeClient(){ @Override public boolean onCreateWindow(WebView webView, boolean isDialog, boolean isUserGesture, Message resultMsg) { WebView newWebView = new WebView(getActivity()); webView.addView(newWebView); WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; transport.setWebView(newWebView); resultMsg.sendToTarget(); newWebView.setWebViewClient( new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { if (url.contains( "//www.tuohang.net" )){ toast( "拦截到了" + url); Intent intent = new Intent(getActivity(), CommonWebViewActivity. class ); intent.putExtra( "url" ,url); startActivity(intent); } else { webView.loadUrl(url); } return true ; } }); return true ; } }); } |
以上这篇Android WebView拦截iframe标签内部跳转教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/yuan7016/article/details/96429955