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的天地就看各位了。打完,收工。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 04:24:18

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

A4纸网页打印 html网页页面的宽度设置成多少

A4纸竖向打印,html网页页面的宽度设置成多少?这个问题是我们大家所疑惑的,于是网上搜集整理下,希望可以帮助你们 最近开发项目时遇到了网页打印的问题,这是问题之二,打印宽度设置 在公制长度单位与屏幕分辨率进行换算时,必须用到一个DPI(Dot Per Inch)指标. 经过我仔细的测试,发现了网页打印中,默认采用的是96dpi,并非传闻的72dpi A4纸张的尺寸是210×297mm,按1英寸=25.41mm换算,即8.264×11.688英寸 所以,A4纸96dpi下的分辨率是794×112

Android应用开发-------------WebView(一)之WebView与服务器端的Js交互

最近公司再添加功能的时候,有一部分功能是用的html,在一个浏览器或webview中展示出html即可.当然在这里我们当然用webview控件喽 WebApp的好处: 在应用里嵌套web的好处有这么几点,1,跨平台,不仅可以在Android上运行,也可以在ios上运行,而且样式什么的绝对统一,因为都是加载的html,用的都是同一套html 2,修改灵活,容易更新版本.例如大家常看到的app里面的广告页,大多是嵌套的html,这样只要后台替换一下页面的内容,手机端就会改变展现内容,跟新版本也是如此

android NDK开发在本地C/C++源码中设置断点单步调试具体教程

近期在学android NDK开发,折腾了一天,最终可以成功在ADT中设置断点单步调试本地C/C++源码了.网上关于这方面的资料太少了,并且大都不全,并且调试过程中会出现各种各样的问题,真是非常磨人.程序员就得有耐心. 把自己的调试过程记录下来.希望对须要的朋友有帮助. 在看本文之前,请先确保你已经成功编译了一个android NDKproject,而且可以在模拟器或者真机上执行.至于怎么编译NDKproject,包含配置.生成.so文件等等.可以參考我的前一篇博客:http://blog.cs

findlibrary returned null产生的联想,Android ndk开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)

很多朋友在开发Android JNI的的时候,会遇到findlibrary returned null的错误,因为某种原因,so没有打包到apk中.下面浅析下引起该错误的原因以及平台兼容性问题. 一.没有将so打包到apk中的原因. 当你发现到findlibrary returned null的错误时,其实最直接的解决办法就是解压apk,看看apk中的x86.armeabi.armeabi-v7a文件夹中是否有对应的so,此时你可能在对应的文件夹下发现少了so,然后再去查原因即可. 一般有两方面

Android NDK开发编译时提示 Native method not found,NDK *** could not be resolved

Type '*****' could not be resolved Method '******' could not be resolved 等等很多诸如此类的错误 解决方法: 是由于没有将jni.h导入的缘故,而这个文件在ndk的目录下面. 所以,参照以下步骤: Project Properties -> C/C++ General -> Path and Symbols 选择include标签,Add -> $Android_NDK_HOME/platforms/android-

android真机调试时,访问本地服务ip设置

前提:android通过wifi连接网络a,真机处于网络b,网络a与网络b处于不同网段,可以通过增加route,互相ping通,如果网络a与网络b是在公网当中,则无需进行 如下操作. 使用android真机进行调试时,如果要访问本机的服务下的资源,配置ip需进行如下配置 1.android手机通过wifi连接网络,该网络与本机所处网络在不同网段,但是通过增加路由可以ping通,则可使用该方法继续配置,如果不能ping通,则该方法无效,无需往下进行 在本机执行如下操作,增加路由,启动命令行,执行如

Android安全开发之启动私有组件漏洞浅谈

0x00 私有组件浅谈 android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面.很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击.但是开发者不一定所有的安全问题都能考虑全面. ? 对于这样的问题,最方便的修复方式就是在确定不影响业务的情况下,将这个存在问题的组件不对外导出变成私有组件.这样做的确很有效,私有组件也很安全.但是,如果存在某个私有组件能被导出组件启动的话,那么这个私有组件其实就不再是私有了.如果攻击者可以通过控制导出的组件对私有组件进行控制,那么攻

如何解决Android中的WebView直接加载网页出错?

笔者开发的一个项目中需要用WebView加载网页,程序运行起来后报以下错误: 这是由于缺少权限,需要在AndroidManifset.xml文件中进行权限设置: 把下边这句话加入该xml文件中, <uses-permission android:name="android.permission.INTERNET" /> 把它做为根节点<manifest>的一个子节点即可.

Android攻城狮 WebView(显示网页)

使用WebView在界面中显示网页 通过Intent调用系统浏览器 Uri uri=Uri.parse(url);//url为链接的地址 Intent intent=new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); ----------------------------- 课程目标:通过WebView自制一个简易网页浏览器 课程内容: (1)将WebView加入到你的应用 (2)使用WebView加载页面 (3)获取网络访问权