51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2009|回复: 0
打印 上一主题 下一主题

Android-webview加载网页去除标题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-13 15:01:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在进行app开发时,我们会经常遇到webview加载一个网址的情况,但是仅仅是webview.loadUrl()并不能满足我们的需求,因为一般网页上面都有一个标题,,标题的颜色和我们的app风格可能整体都不太搭,这个时候该怎么办?除了让web端的朋友们专门写一个的情况下,还有另外一个方法,就是利用js或者jquery处理,原理都是一样,这里只讲一下js。


解决步骤就是:

1.查看要加载页面源代码,找到要删除的内容的标签

2.自己定义WebViewClient,重写WebViewClient的方法,在.onPageFinished()中编辑javascript函数将显示标题的部分置空或者删除

3.onPageFinished()中加载显示被JavaScript处理过的网页数据


核心代码】:

  1. import org.jsoup.Jsoup;
  2. import org.jsoup.nodes.Document;
  3. import org.jsoup.nodes.Element;


  4. //webView 相关配置
  5. public void init(){
  6.     webSettings = webView.getSettings();
  7.         webSettings.setDomStorageEnabled(true);  // 加载东方航空,需设置此属性,否则,页面加载为空白页
  8.         //设置WebView属性,能够执行Javascript脚本
  9.         webSettings.setJavaScriptEnabled(true);
  10.         webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
  11.         webSettings.setAllowFileAccess(true);


  12.         webSettings.setUseWideViewPort(true);
  13.         webSettings.setLoadWithOverviewMode(true);

  14.         //清除 webkit cookie,解决webView显示原先界面
  15.         CookieSyncManager.createInstance(this);
  16.         CookieSyncManager.getInstance().startSync();
  17.         CookieManager.getInstance().removeSessionCookie();

  18. }

  19. /加载完毕后,显示webView,防页面闪烁
  20. private void initHandler() {
  21.         mHandler = new Handler(){
  22.             @Override
  23.             public void handleMessage(Message msg) {
  24.                 switch (msg.what){
  25.                     case 0:
  26.                         webView.setVisibility(View.VISIBLE);
  27.                         SysProgress.closeProgress();//关闭加载对话框
  28.                        //获取网页源代码
  29.                         webView.loadUrl("javascript:window.local_obj.showSource('<head>'+"
  30.                                 + "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
  31.                         break;
  32.                 }
  33.             }
  34.         };
  35.     }


  36. final class InJavaScriptLocalObj {

  37. //获取网页源代码,分析当前页面是哪一个页

  38.        @JavascriptInterface
  39.         public void showSource(String html) {
  40.             if(loginUrl.contains("m.airchina.com.cn")){     //国航官网
  41.                 Document document = Jsoup.parse(html);
  42.                 Element nameElement = document.getElementById("uname");
  43.                 Element mileElement = document.getElementById("mileage");
  44.                 if(nameElement!= null && mileElement!= null){    // 登录成功后的页面
  45.                     String name = nameElement.text();
  46.                     String mileStr = mileElement.text();
  47.                     LogUtil.i("name = "+name);
  48.                     LogUtil.i("mile = "+mileStr);
  49.                     String mile="";
  50.                     if(mileStr.contains(":")){
  51.                         mile= mileStr.split(":")[1];
  52.                     }
  53.                     Toast.makeText(VerifyVipActivity.this, "认证成功", Toast.LENGTH_SHORT).show();
  54.                 }
  55.                 else{   //登录页面
  56.                
  57.                 }
  58.             }
  59.         }
  60. }

  61. 【webView相关配置代码】
  62. WebView webView = (WebView) findViewById(R.id.webview);
  63.         WebSettings webSettings = webView.getSettings();
  64.         webSettings.setJavaScriptEnabled(true);
  65.         webSettings.setUseWideViewPort(true);
  66.         webSettings.setLoadWithOverviewMode(true);
  67.         webView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
  68.         loginUrl = "https://m.airchina.com.cn/ac/c/invoke/login@pg";
  69.         webView.loadUrl(loginUrl);


  70.         webView.setWebViewClient(new WebViewClient(){
  71.      
  72.            @Override
  73.             public void onPageStarted(WebView view, String url, Bitmap favicon) {
  74.                 super.onPageStarted(view, url, favicon);

  75.                 webView.setVisibility(View.INVISIBLE);
  76.                 SysProgress.showProgress(VerifyVipActivity.this); //显示加载对话框

  77.             }


  78.             @Override
  79.             public void onPageFinished(WebView view, String url) {
  80.                 super.onPageFinished(view, url);
  81.                   //getElementById()        返回对拥有指定 id 的第一个对象的引用。
  82.                 //getElementsByName()        返回带有指定名称的对象集合。
  83.                //getElementsByTagName()        返回带有指定标签名的对象集合。
  84.               //getElementsByClassName   返回指定class的对象的集合。
  85.             
  86.                 //编写 javaScript方法,使用的是js脚本语言
  87.                 String javascript = "javascript:function hideOther() {" +

  88.                         "document.getElementsByTagName('body')[0].innerHTML;" +
  89.                         "document.getElementsByTagName('header')[0].style.display='none';" +  //取标题栏

  90.                          /*改变国航登录页面的样式*/
  91.                         "if(document.getElementById('regbtn')){" +
  92.                             "document.getElementsByTagName('span')[0].style.display='none';" +
  93.                             "document.getElementsByTagName('span')[1].style.display='none';" +
  94.                             "document.getElementById('regbtn').style.display='none';" +
  95.                             "document.getElementById('subbtn').style.backgroundColor='#38761D';" +
  96.                             "document.getElementById('subbtn').style.borderColor='#ffffff';" +
  97.                             "document.getElementsByClassName('am-padding-left-xs')[0].style.width='100%';" +
  98.                         "}else{" +
  99.                              /*改变国航登录成功后页面的样式*/
  100.                             "document.getElementsByClassName('am-container')[0].style.display='none';" +
  101.                         "}" +

  102.                         "}";

  103.                 //创建方法
  104.                 view.loadUrl(javascript);
  105.                 //加载方法
  106.                 view.loadUrl("javascript:hideOther();");
  107.                 mHandler.sendEmptyMessageDelayed(0,500);
  108.             }
  109.         });
复制代码

注: 因为本质是webView加载两次Url,一次是原本的Url,一次是处理过的URL ,所以刚进入页面加载的原始页面,过了一段时间是闪烁一下,加载显示的是操作后的Url. 所以,加载开始时webview不可见,显示加载对话框,加载完成后,500ms后,显示webView,关闭对话框。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-15 13:51 , Processed in 0.062328 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表