android 在开发WebView时,去掉网页的标题并设置成自己定义的标题

IOS中关于去掉标题仅仅需类似以下的两行代码

[js appendString:@"var title = document.getElementsByClassName('navbar-top')[0];"];
[js appendString:@"title.parentNode.removeChild(title);"];

而android上面拿掉网页的标题还真是难事,自己花了好几天的时间最终大功告成。现眼下这绝对是拿掉标题换成自己定义的标题的第一人。

网上的都是更改标题的文字。可有时载入的H5页面的标题与app风格不一时,就必须把标题栏拿掉换成自己的标题栏。

先上网页的图和最后换掉标题的图

上一段网页的源代码


1。初始化WebView并设置下面属性


webview= (WebView) findViewById(R.id.newer_guide_webview);
//设置WebView属性,可以运行Javascript脚本
webview.getSettings().setJavaScriptEnabled(true);
//载入须要显示的网页
webview.setWebViewClient(new MyWebViewClient());
webview.loadUrl(mUrl);
//设置Web视图
webview.getSettings().setJavaScriptEnabled(true);
webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

2,自己定义WebviewClient,即继承WebViewClient并实现他的方法。并加入jsoup   jar包(这样的方法不好。后面有正确的方式)

//Web视图
    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            if (!firstLink){//必须加上,不然会不断刷新WebView界面
                firstLink=true;
               /**拿掉标题的主要代码   開始**/

                Document doc = null;
                try {
                    doc = Jsoup.connect(mUrl).get();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                titleString = doc.getElementsByClass("nav-title").text();
                System.out.println("*******" + titleString);

               /**拼凑要显示H5  開始**/   /**要想拼凑成功就必须把上面的网页图看懂,<></>称为一个Element   其会包括全部当中的内容**/
                Elements content = doc.getAllElements();
                String html="<!DOCTYPE html> \n" + "<html lang=\"zh-cn\">";
                html+=content.get(2).toString()+"<body>\n" +"<div class=\"main\">";  //此次的数字得自己写个for循环打印每一个element将数字替换
                html+=content.get(16).toString();
               /**拼凑要显示H5  開始**/

                view.loadDataWithBaseURL(mUrl, html, "text/html", "utf-8", null);  //仅仅要有这句就得声明firstLink,不然一直刷新界面

            /**拿掉标题的主要代码   開始**/
            }

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);   

//标题栏的操作       
            TextView actionBarTitle = (TextView)findViewById(R.id.actionbar_middle);
            actionBarTitle.setText(titleString);
            TextView leftTv = (TextView)findViewById(R.id.actionbar_left);
            /**
             * 必须设置下面属性。不然左键头不显示
             */
            Drawable drawable = getResources().getDrawable(R.drawable.btn_back);
            drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
            leftTv.setCompoundDrawables(drawable, null, null, null);
            leftTv.setVisibility(View.VISIBLE);

        }
    }

以上的方法会造成严重的耗电脑内存,我測试的时候,导致一调试代码,8G的内存电脑都吃紧。主要可能是 doc = Jsoup.connect(mUrl).get();导致。并且终于的效果是标题栏拿掉了,但是标题栏的地方是空白,也就是没把布局给拿掉。IOS处理的方法是将WebView的Y坐标上移一段,将WebView的高度添加上移的高度,可在android端设置后没用。且设置后会出现WebView的地方不可触碰。

以上仅仅能拿掉标题,没办法拿掉标题的空白。

换还有一种方式,在布局中下功夫。将布局设置为窗口,使用标题栏悬浮在最上层的结构,覆盖网页的标题栏就达到了效果。上布局和整个代码

<?

xml version="1.0" encoding="utf-8"?

> <FrameLayout xmlns:ActionBar="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <WebView android:id="@+id/newer_guide_webview" android:layout_width="match_parent" android:layout_height="match_parent"> </WebView> <!-- 自己定义标题,必须更改,actionBar是自己的标题的命名空间。得换--> <LinearLayout android:layout_width="wrap_content" android:layout_gravity="top" android:layout_height="wrap_content" android:orientation="vertical"> <com.pitaya.daokoudai.view.widget.ActionBar android:id="@+id/actionbar" android:layout_width="match_parent" android:layout_height="wrap_content" ActionBar:leftImg="@drawable/btn_back" ActionBar:title="@string/more_item_notice"/> <View style="@style/Divider"/> </LinearLayout> </FrameLayout>

上activity的整个代码,不用上面的第二步代码

package com.pitaya.daokoudai.view.activity.more;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

import com.pitaya.daokoudai.R;
import com.pitaya.daokoudai.common.util.CommonUtil;
import com.pitaya.daokoudai.common.util.ViewHolderUtils;

/**
 *站点公告
 */
public class WebsiteNoticeActivity extends Activity{
   private WebView webview;
   /**
    * 要訪问的url
    */
   private String mUrl;
   private String titleString;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_website_notice);
      mUrl = getIntent().getStringExtra("url");

      initWidget();
   }

   @Override
   protected void onResume() {
      super.onResume();
   }

   private void initWidget() {
      webview= (WebView) findViewById(R.id.newer_guide_webview);
      //设置WebView属性,可以运行Javascript脚本
      webview.getSettings().setJavaScriptEnabled(true);
      //载入须要显示的网页
      webview.setWebViewClient(new MyWebViewClient());
      webview.loadUrl(mUrl);
      //设置Web视图
      webview.getSettings().setJavaScriptEnabled(true);
      webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
   }
   @Override
   //设置回退
   //覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
   public boolean onKeyDown(int keyCode, KeyEvent event) {
      if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
         webview.goBack(); //goBack()表示返回WebView的上一页面
         return true;
      }
      return false;

   }

   //Web视图
   private class MyWebViewClient extends WebViewClient {
      @Override
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url);
         return true;
      }
      @Override
      public void onPageStarted(WebView view, String url, Bitmap favicon) {
         super.onPageStarted(view, url, favicon);
         CommonUtil.showProgressDialog(WebsiteNoticeActivity.this, getString(R.string.doing), true);
      }

      @Override
      public void onPageFinished(WebView view, String url) {
         super.onPageFinished(view, url);
         CommonUtil.closeProgressDialog();
         TextView actionBarTitle = ViewHolderUtils.find(WebsiteNoticeActivity.this, R.id.actionbar_middle);
         actionBarTitle.setText(getResources().getString(R.string.more_item_notice));
         TextView leftTv=ViewHolderUtils.find(WebsiteNoticeActivity.this,R.id.actionbar_left);
         /**
          * 必须设置下面属性。不然左键头不显示
          */
         Drawable drawable = getResources().getDrawable(R.drawable.btn_back);
         drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
         leftTv.setCompoundDrawables(drawable, null, null, null);
         leftTv.setVisibility(View.VISIBLE);

      }
   }
   public void onClick(View v) {
      if (v.getId()==R.id.actionbar_left){
         if (webview.canGoBack()) {
            webview.goBack();
         } else {
            finish();
         }
      }

   }

}

使用覆盖的方式完美解决,上述的第二步可能也能够。仅仅是我在移动Y并增高时不能用,哎,android是没有IOS简单啊。android的天地就看各位了。

打完,收工。


(二)点击载入网页中的button跳转到自己定义的activity  代码例如以下。将register取代为为你的点击button跳转的URL里的某个字段,这个能够在浏览器中查看到

//Web视图
private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && url.contains("register")) {
            Intent intent = new Intent(DkdNewerGuideActivity.this, RegisterStep1Activity.class);
            DkdNewerGuideActivity.this.startActivity(intent);
            //finish();

        }else{
            view.loadUrl(url);
        }
        return true;
    }
......
 }


posted @ 2017-06-05 14:52  jzdwajue  阅读(811)  评论(0编辑  收藏  举报