android4.4.2iframe,AndroidWebView拦截iframe标签内部跳转
教程
最近项⽬⾥有个⼴告位需要动态配置,后台给了⼀段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,⾃⼰做处理。
⽐如,下⾯是⼀段html代码,嵌套这iframe标签,src就是跳转地址,我现在就要当你点击该⽹址的时候做拦截,⾃⼰做处理⽽不是跳转。
oh,我还是第⼀次知道iframe标签,不过想着应该和普通拦截h5差不多,兴致勃勃的就开始撸代码了,但是⽆论怎么配置WebView,还是重写 shouldOverrideUrlLoading ,就是拦截不了iframe⾥的⽹址。。。后来研(bai)究(du)了很久,终于拦截到了。
实现⽅法:
⾸先,你的WebView要 setWebViewClient ,重写
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 (ains("www.jb51")){
toast("拦截到了" + url);
Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);
intent.putExtra("url",url);
startActivity(intent);
}else {
webView.loadUrl(url);
}
return true;
}
});
return true;
}
});
完整的代码如下:
private void initWebView(WebView webView) {
//启⽤⽀持javascript
WebSettings settings = Settings();
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); //⾃适应屏幕
iframe嵌套页面加载慢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) {
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 (Url().toString().contains("www.baidu")){
toast("拦截到了baidu");
}else {
webView.Url().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 (ains("//www.jb51")){
toast("拦截到了" + url);
Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);
intent.putExtra("url",url);
startActivity(intent);
}else {
webView.loadUrl(url); }
return true;
}
});
return true;
}
});
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。