(一)使用中遇到的问题:

1、解决webview缓存: WebSettings.LOAD_NO_CACHE   或者直接清除缓存

webView.getSettings().setCatchMode(WebSettings.LOAD_NO_CATCH);

2、解决webview无法弹出alert: WebChromeClient中重写onJsAlert方法

3、解决webview获取网页内容“: addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj")

(二)webview组件如何使用:

添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。

在要Activity中生成一个WebView组件:WebView webView = new WebView(this);或者可以在activity的layout文件里添加webview控件:

<WebView

android:id="@+id/wv"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="@string/hello"/>

(三)设置WebView基本信息

/**
  * 显示WebView
  */
 public void showWebView(String url){
     webview.getSettings().setJavaScriptEnabled(true);  //  设置页面支持Javascript
     webview.getSettings().setLoadWithOverviewMode(true);
     webview.getSettings().setSupportZoom(true);          //支持缩放
     webview.getSettings().setBuiltInZoomControls(true); //显示放大缩小
     webview.setInitialScale(130); //初始化时缩放
     webview.getSettings().setDefaultTextEncodingName("utf-8"); 
      webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//解决缓存问题
     webview.loadUrl(url);
     
     webview.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");//获取网页内容
     webview.setWebViewClient(new MyWebViewClient());
     webview.setWebChromeClient(new HellowebViewClient());
 }
 
 final class InJavaScriptLocalObj {  //获取网页内容
        public void showSource(String html) { 
           // Log.d("HTML", html);        
            if((html != null && html.contains("重新登录")) || (html != null && html.contains("nologin.jsp"))) {
             Log.d("TAG", "重新登录");
             Toast.makeText(getApplicationContext(), "获取信息失败,请重新访问", 0).show();
            }
        } 
    }
 
 /**
  * 解决webview中当开启新的页面的时候用webview来进行处理而不是用系统自带的浏览器处理
  *
  * 载入页面完成的事件,获取网页内容
  * @author Administrator
  *
  */
 private class MyWebViewClient extends WebViewClient {
  /**
   *  如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
   *  给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法:
    * shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时
    * WebViewClient会调用这个方法,并传递参数:按下的url。比如当webview内嵌
    *  网页的某个数字被点击时,它会自动认为这是一个电话请求,会传递url:tel:123,
    *  如果你不希望如此可通过重写shouldOverrideUrlLoading函数解决
   */
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
      // 当开启新的页面的时候用webview来进行处理而不是用系统自带的浏览器处理
   // 互联网用:webView.loadUrl("http://www.google.com");
         // 本地文件用:webView.loadUrl("file:///android_asset/XX.html");  本地文件存放
            view.loadUrl(url); 
   return true;
  }
  
  /**
  *载入页面完成的事件
  **/
  @Override
  public void onPageFinished(WebView view, String url) {
   //获取网页内容
   view.loadUrl("javascript:window.local_obj.showSource" +
     "('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
   super.onPageFinished(view, url);
  } 
  
 }
 /***************************************************/
 
 /**
  * 解决webview中无法弹出alert的问题
  */
 private class HellowebViewClient extends WebChromeClient {
  @Override
  public boolean onJsAlert(WebView view, String url, String message,
       final JsResult result) {
         AlertDialog.Builder b2 = new AlertDialog.Builder(Test.this)
                  .setTitle("提示:").setMessage(message)
                  .setPositiveButton("ok",
                          new AlertDialog.OnClickListener() {
                              @Override
                              public void onClick(DialogInterface dialog,
                                      int which) {
                                  result.confirm();
                              }
                          });
         b2.setCancelable(false);
            b2.create();
            b2.show(); 
        return true;
     }
 }
 /*
 1,接收到Http请求的事件
 onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
 2,打开链接前的事件
 public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; }
 这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
 
 3,载入页面完成的事件
 public void onPageFinished(WebView view, String url){ }
 同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。
 
 4,载入页面开始的事件
 public void onPageStarted(WebView view, String url, Bitmap favicon) { }
 这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
 */

(四)WebView基础

WebView是android.webkit包下的一个组件,能用来显示网页。

WebView默认是不带地址栏和加载进度条的,单单是一个显示页面内容的面板。

使用WebView非常简单,主要是通过load方法进行加载。

[使用WebView打开一个网页] 1.在布局xml文件中定义WebView组件 < WebView  android:id = "@+id/webview"      android:layout_width = "match_parent"      android:layout_height = "match_parent" />

2.在AndroidManifest.xml中添加网络访问权限 <

uses-permission

android:name

=

"android.permission.INTERNET"

/ >

3.通过load函数加载网页

mWebview = (WebView) this .findViewById(R.id. webview  ); // 简单地加载一个页面

mWebview .loadUrl(url); //  加载assets目录下的页面(assetsindex.html)

mWebview .loadData( "file:///android_asset/index.html"  );

但你会发现,如果点击页面的某条链接进行跳转的话,会启动系统的默认浏览器进行加载,调出了我们本身的应用。要解决这个问题我们需要借助于WebViewClient。

[自定义链接的跳转显示]

mWebview .setWebChromeClient( new WebViewClient()  {

public  boolean  shouldOverrideUrlLoading(WebView  view, String  url){             //  使用当前的WebView加载页面

view.loadUrl(url);

return  true ;

}

});

在WebViewClient中还有很多的方法,例如: public  void  onPageStarted(WebView view, String url, Bitmap favicon);

public  void  onPageFinished(WebView view,  String url);

public  void  onLoadResource(WebView view,  String url)

public  void  onReceivedError(WebView  view,  int  errorCode, String description, String  failingUrl)

我们都可以通过重写来实现自己的个性化操作。

[页面回退] 实现了跳转后,你忽然想返回到前一个浏览过的页面是,发现返回键是直接退出应用了。要实现类似系统浏览器那样的,返回键先是返回到上一个页面,直到最初始的页面才退出的话,可以这么做:

//  重写onKeyDown

public  boolean  onKeyDown (  int  keyCode, KeyEvent event) {

if  ((keyCode == KeyEvent. KEYCODE_BACK ) &&  mWebview .canGoBack())  {

mWebview  .goBack();

return  true ;

}

return  super .onKeyDown(keyCode, event);

}

[进度条] 要是再加上加载进度条那就完美了,我们可以借助WebChromeClient来实现:

mWebview  .setWebChromeClient( new WebChromeClient()  {

public  void  onProgressChanged (WebView view,  int  newProgress){

loadingProgress .setProgress(newProgress);

}

});

android 之WebView的更多相关文章

  1. Android中webView和网页的交互

     Android中webView和网页的交互 Android中webView跟网页的交互式通过JavaScript进行的.具体步骤: 1.创建JavaScript,在点击的时候调用JavaScript ...

  2. Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数

    1.主要布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...

  3. Android中Webview使用自定义的javascript进行回调

    先说为什么需要讨论这个问题. 现在很多的手机应用,都可能会直接嵌入一个web页面.这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端:另一个是功能通用,不仅a ...

  4. android使用Webview上传图片

    package com.example.webview; import java.io.File; import android.net.Uri;import android.os.Bundle;im ...

  5. Android之 -WebView实现离线缓存阅读

    前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有 ...

  6. 在Android的webview中定做js的alert,confirm和prompt对话框的方法

    在Android的webview中定制js的alert,confirm和prompt对话框的方法 http://618119.com/archives/2010/12/20/199.html 1.首先 ...

  7. Android 响应webview中图片的点击事件

    最近碰到个新需求需要点击webview中的图片进行放大显示. 整理了下思路,想到了下面的一个可行的方案. 方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地 ...

  8. android利用WebView实现浏览器的封装

    android提供了封装浏览器的接口,可以让开发者利用自己的view显示网页内容.今天又实现研究了一下,利用WebView显示浏览器内容,还可以利用 WebViewClient显示自己需要的内容. 参 ...

  9. [原][Android]All WebView methods must be called on the same thread.

    问题 webView调用JS出错. class TestJS {         ......         public TestJS(){         }                   ...

  10. android使用webview加载flash文件

    android 字段webview几乎实现了浏览器的全部功能,最近在使用webview加载不固定格式的文章,文章中有一部分嵌入了flash,下面就是webview可以进行视频需要进行的设置,代码如下: ...

随机推荐

  1. 安卓app测试之Monkey测试

    一.Monkey特点 1.运行时机:一般是产品稳定后 首轮功能测试完成的夜间进行 2.需要知道packageName 3.目的:主要测试产品是否存在崩溃问题和ANR问题. 二.获取包名的两个方法 首先 ...

  2. java虚拟机(二)--类加载机制和双亲委派模型

    一.类的生命周期 加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸 ...

  3. 18SVN进行版本控制

    SVN进行版本控制 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. SVN Website.

  4. python学习,使用requests库来模拟登录github,post请求。

    这次我们要模拟登录的页面是 https://github.com/login 首先我们先尝试着登陆一遍分析一下请求, 打开开发者工具下的network选项, 可以很清楚的看到这个会话session,而 ...

  5. Quartz原理解密

    Quartz原理解密 Author: Dorae Date:2018年7月17日15:55:02 转载请注明出处 一.quartz概述 quartz是一个用java实现的开源任务调度框架,可以用来创建 ...

  6. I - 最少拦截系统

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ],su ...

  7. Thread的方法join()使用

    join()的作用:Waits for this thread to die.等待线程对象销毁.在Thread源码中可以看到join源码是使用了wait()方法来实现等待功能. 因为join()内部使 ...

  8. JAVA虚拟机运行时内存划分--运行时数据区域

    Java虚拟机在执行java程序时会把内存划分为以下几个不同的数据区域: java虚拟机内存划分(运行时)1.线程私有的: 程序计数器(Program Counter Register):可以看作当前 ...

  9. [bzoj1617][Usaco2008 Mar]River Crossing渡河问题_动态规划

    River Crossing渡河问题 bzoj-1617 Usaco-2008 Mar 题目大意:题目链接. 注释:略. 想法:zcs0724出考试题的时候并没有发现这题我做过... 先把m求前缀和, ...

  10. SiteMesh基础教程

    SiteMesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架.它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等. 教 ...