webView 总结

来源:互联网 发布:桌面工作计划软件 编辑:程序博客网 时间:2024/06/05 03:47
如何创建WebView:

    1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
    2、在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
    3、设置WebView基本信息:
          如果访问的页面中有Javascript,则webview必须设置支持Javascript。
          webview.getSettings().setJavaScriptEnabled(true);  
          触摸焦点起作用
          requestFocus();//如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。
          取消滚动条
          this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
    4、设置WevView要显示的网页:
          互联网用:webView.loadUrl("http://www.google.com");
          本地文件用:webView.loadUrl("file:///android_asset/XX.html");  本地文件存放在:assets文件中
    5、如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
          给WebView添加一个事件监听对象(WebViewClient)      
        
          并重写其中的一些方法
                shouldOverrideUrlLoading:对网页中超链接按钮的响应。
                                          当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url
                onLoadResource   
                onPageStart  
                onPageFinish  
                onReceiveError
                onReceivedHttpAuthRequest
        

    6、如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
       覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
    public boolean onKeyDown(int keyCoder,KeyEvent event){
                        if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
                              webview.goBack();   //goBack()表示返回webView的上一页面


                                 return true;
                           }
                        return false;
                   }

  WebView相关问题注意:

Android的webView很强大,其实就是一个浏览器,你可以把它嵌入到你想要的位置,我这里遇到两个问题,就是怎么知道网页的加载进度和加载网页时,
点击网页里面的链接还是在当前的webview里跳转,不想跳到浏览器那边,解决办法如下:
//此方法可以处理webview 在加载时和加载完成时一些操作
webView.setWebChromeClient(new WebChromeClient(){
  @Override
  public void onProgressChanged(WebView view, int newProgress) {
    if(newProgress==100){                        // 这里是设置activity的标题, 也可以根据自己的需求做一些其他的操作
          title.setText("加载完成");
     }else{
     title.setText("加载中.......");
      }
    }
});
webView.setWebViewClient(new WebViewClient(){
  @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {  //重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
       view.loadUrl(url);
       return true;
  }
        @Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重写此方法可以让webview处理https请求
handler.proceed();
}
});

 

1.android提供了webView控件专门用来浏览网页。
然后在程序中装载webView控件,设置属性,比如:颜色、字体、要访问的网址等。通过loadUrl方法设置当前webView需要访问的网址。在创建WebView时,系统有一个默认的设置,我们可以通过WebView.getSettings来得到这个设置。
 

2.下面是设置一些常用属性、状态的方法
WebSettings常用方法:
setAllowFileAccess 启用或禁止WebView访问文件数据
setBlockNetworkImage 是否显示网络图像
setBuiltInZoomControls 设置是否支持缩放
setCacheMode 设置缓冲的模式
setDefaultFontSize 设置默认的字体大小
setDefaultTextEncodingName 设置在解码时使用的默认编码
setFixedFontFamily 设置固定使用的字体
setJavaSciptEnabled 设置是否支持Javascript
setLayoutAlgorithm 设置布局方式
setLightTouchEnabled 设置用鼠标激活被选项
setSupportZoom 设置是否支持变焦

WebViewClient常用方法:
doUpdate VisitedHistory 更新历史记录
onFormResubmission 应用程序重新请求网页数据
onLoadResource 加载指定地址提供的资源
onPageFinished 网页加载完毕
onPageStarted 网页开始加载
onReceivedError 报告错误信息
onScaleChanged WebView发生改变
shouldOverrideUrlLoading 控制新的连接在当前WebView中打开

WebChromeClient常用方法:
onCloseWindow 关闭WebView
onCreateWindow 创建WebView
onJsAlert 处理Javascript中的Alert对话框
onJsConfirm处理Javascript中的Confirm对话框
onJsPrompt处理Javascript中的Prompt对话框
onProgressChanged 加载进度条改变
onReceivedlcon 网页图标更改
onReceivedTitle 网页Title更改
onRequestFocus WebView显示焦点
 

3. android webView相关知识
@下面的代码通过loadUrl方法设置当前webView需要访问的网址:
mWebView=(WebView) findViewById(R.id.WebView01);
mWebView.loadUrl(“http://www.sogou.com”);
@在android中专门通过WebSettings来设置WebView的一些属性、状态等。在创建WebView时,系统有一个默认的设置,我们可以通过WebView.getSettings来得到这个设置:
WebSettings webSettings=mWebView.getSettings();//取得对象
WebSettings和WebView都在同一个生命周期中存在,当WebView被销毁后,如果再使用WebSettings,则会抛出异常。
@使用WebViewClient来完成在应用程序中自定义网页浏览程序:
WebViewClient是辅助WebView处理各种通知、请求等事件的类。通过WebView的setWebViewClient方法指定WebViewClient对象。
WebView可以通过覆盖WebViewClient方法来辅助WebView浏览网页:
public Boolean shouldOverrideUrlLoading
(WebView view,String url){view .loadUrl(url);return true;}
 

 

4. android webView实例
实例中使用EditText输入网址,用Button来确认连接,用webView显示网页内容。
这里使用了WebViewClient来辅助WebView处理一些事件,因此我们显示的网页都是在一个WebView控件中。可以通过goBack和goForward方法设置前进和后退,先检查是否可以前进和后退:
if((keyCode==keyEvent.KEYCODE_BACK)&&mWebView.canGoBack())
{
mWebView.goBack()//返回前一个页面
return true;
}
例子中,通过自制浏览器访问一个包含javascript对话框的html页面。通过点击界面上的“警告,提醒对话框”按钮、“带选择的对话框”按钮、“要求用户输入的对话框”按钮,界面分别会弹出对话框“这是一个警告对话框”、“更多信息请到我的博客去”正常按钮/取消按钮、“输入对话框”正常按钮/取消按钮、一个跳转页面。Js html页面在代码包的根目录下(dialog.html)。
我们通过setWebChromeClient方法为WebView设置一个WebChromeClient对象,辅助WebView处理js对话框,监听按钮事件,然后通过confirm和cancel方法将我们的操作传递给js处理。
package com.yarin.android.Examples_08_06;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.graphics.Bitmap;
……
public class Activity01 extends Activity
{
private final String DEBUG_TAG = "Activity01";
private Button mButton;
private EditText mEditText;
private WebView mWebView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button) findViewById(R.id.Button01);
mEditText = (EditText) findViewById(R.id.EditText01);
mWebView = (WebView) findViewById(R.id.WebView01);
//设置支持JavaScript脚本
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
//设置可以访问文件
webSettings.setAllowFileAccess(true);
//设置支持缩放
webSettings.setBuiltInZoomControls(true);
//设置WebViewClient
mWebView.setWebViewClient(new WebViewClient()
{
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url)
{
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
{
super.onPageStarted(view, url, favicon);
}
});

2、WebView 显示sd卡图片:
[java] 
webView.loadDataWithBaseURL(null,"<img src=\"www.2cto.com" />", "text/html", "utf-8", null); 
3、WebView显示字符串
[java]
webView.loadDataWithBaseURL("fake://not/needed", s1, "text/html", "utf-8", ""); 
4、设置WebView中显示字体的大小
[java] 
public static final TextSize[] FONT_SIZES = new TextSize[]{TextSize.SMALLER,TextSize.NORMAL,TextSize.LARGER}; 
    private WebSettings wb; 
    wb = mWebViewRightContent.getSettings(); 
    wb.setTextSize(FONT_SIZES[iFontSizeId]); 
字体大小:
[java] 
public enum TextSize { 
        SMALLEST(50), 
        SMALLER(75), 
        NORMAL(100), 
        LARGER(150), 
        LARGEST(200); 
        TextSize(int size) { 
            value = size; 
        } 
        int value; 
    } 
5、WebView显示html文件时,若要达到和PC上浏览器显示的效果完全一样,只需对WebView做一下设置即可:
[java] view plaincopy
//适应全屏  39适应竖屏    57适应横屏 
    mWebView.setInitialScale(39); 
注意的是:html只字体太小的话,在Android手机或开发板上显示的就相当的小。一般6、7号字体吧!
6、WebView设置渐变:
[java]
android:fadingEdge="vertical" 
    android:fadingEdgeLength="20px" 
(垂直方向,上下渐变区域为20px)
7、设置WebView可触摸放大缩小:
[java] 
mWebView.getSettings().setBuiltInZoomControls(true); 
8、WebView双击变大,再双击后变小,当手动放大后,双击可以恢复到原始大小,如下设置:
[java] 
webView.getSettings().setUseWideViewPort(true); 
9、几种加速WebView加载的方法
· 提高渲染的优先级
[java]
webView.getSettings().setRenderPriority(RenderPriority.HIGH); 
· 使用webView.getSettings().setBlockNetworkImage,把图片加载放在最后来加载渲染
[java] 
webView.getSettings().setBlockNetworkImage(true); 
10、将字符串转换成HTML形式的文件显示:
[java]
//获取的字符串 
    String sDetails = cursor.getString(cursor.getColumnIndex("sChinese")); 
    //按行截取字符串,将其存放在数组中 
    String[] str = sDetails.split("\n"); 
    String s1 = ""; 
    //遍历数组进行判断,如果条件成立,就添加设定的css样式 
    for(int i = 0;i < str.length;i ++){ 
        if(str[i].trim().startsWith("vt.")){ 
            str[i] = "<h3 style=\"font-size:10px; color:#000; background:#FCFCFC; padding:3px 5px;\">" + str[i] + "<h3>" + "\n"; 
        }else if(getMark(str[i].trim())){ 
            str[i] = "<h4 style=\"font-size:10px; color:#F60; font-weight:normal;\">" + str[i] + "</h4>" + "\n"; 
        }else if(str[i].trim().startsWith("〖")){ 
            str[i] = "<span style=\"color:#333; font-size:10px; color:#F60\">" + str[i] + "</span>" + "\n"; 
        }else { 
            str[i] = "<p style=\"line-height:16px; font-size:10px;color:#666;\">" + str[i] + "</p>" + "\n"; 
        } 
        //将修改后的字符串拼接起来 
        s1 += str[i]; 
    } 
    //用WebView将字符串以HTML的形式显示出来 
    webView.loadDataWithBaseURL("fake://not/needed", s1, "text/html", "utf-8", ""); 

4、处理惩罚https恳求
webView默认是不处理惩罚https恳求的,页面显示空白,须要进行如下设置:
Java代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
    webView.setWebViewClient(new WebViewClient() {  
        @Override
        public
void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {  
            handler.proceed();  
//            handler.cancel();
//            handler.handleMessage(null);
        }  
    });  
onReceivedSslError为webView处理惩罚ssl证书设置
此中handler.proceed();默示守候证书响应
handler.cancel();默示挂起连接,为默认体式格式
handler.handleMessage(null);可做其他处理惩罚

 

5、应用addJavascriptInterface完成和js交互
5.1 javascript中调用java对象及办法
设置webView的addJavascriptInterface办法,该办法有两个参数,第一个参数为被绑定到js中的类实例,第二个参数为在js中露出的类别号,在js中引用java对象就是用这个名字
Java代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();  
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");   
实现绑定到js的类,此中的javaMethod办法我们将在页面前端js中调用,用于返回一段内容。showHtml用来应用AlertDialog显示一段html代码,稍后将应用到
Java代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
private
class ClassBeBindedToJS{  
    public
void showHtml(String html){  
         new AlertDialog.Builder(UpdateStatusActivity.this)   
                     .setTitle("HTML").setMessage(html)  
                     .setPositiveButton(android.R.string.ok, null)  
                     .setCancelable(false).create().show();  
    }  
    public String javaMethod() {  
        return
"use java method";  
    }  
};  
如此我们就可以在前端调用java对象,如下:
Html代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
<span><html>
    <body>
        <div
id="displayDiv">Test page.</div>
        <input
type="button"
value="use java object"
onclick="document.getElementById(""</span>displayDiv"").innerHTML=classNameBeExposedInJs.javaMethod()"
/>
<span>
</body>
</html></span>
这段html感化为点击button按钮,改变div内容为java对象办法中的内容,此中classNameBeExposedInJs为java对象在js中的别号,javaMethod为java对象的办法
5.2 java中调用js办法
用webView的loadUrl实现,比如如今我们想在页面加载完成后调用js中的hello函数,实现如下:
Java代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
webView.setWebViewClient(new WebViewClient() {   
    @Override
    public
void onPageFinished(WebView webView, String url){  
        webView.loadUrl("javascript:hello()");  
    }  
});  
怎么样,很简单吧^_^,直接loadUrl("javascript:hello()")就可以了
哄骗这一点我们可以很便利的实现WebView的主动化,如网页主动化登录。举个栗子,实现http://m.renren.com/ 的主动登录啊,代码如下
Java代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
webView.getSettings().setJavaScriptEnabled(true);  
webView.loadUrl("http://m.renren.com");  
webView.requestFocus();  
ClassBeBindedToJS classBeBindedToJS = new ClassBeBindedToJS();  
webView.addJavascriptInterface(classBeBindedToJS, "classNameBeExposedInJs");      
webView.setWebViewClient(new WebViewClient() {   
    @Override
    public
void onPageFinished(WebView webView, String url){   
        webView.loadUrl("javascript:document.getElementsByName(""email"")[0].value=""userName""");   
        webView.loadUrl("javascript:document.getElementsByName(""password"")[0].value=""userPassword""");   
        webView.loadUrl("javascript:document.getElementsByName(""login"")[0].click()");  
    }  
});  
从中可以看出先加载http://m.renren.com页面,在页面加载完成onPageFinished后,调用js实现主动登录
此中三句js分别默示设置用户名文本框内容、设置用户暗码文本框内容、点击登录按钮,如此登录成功喽
5.3 java和js混用实现一些结果
5.3.1 WebView用AlertDialog显示页面的html代码
之前5.1中的showHtml办法如今派上用处啦,在页面加载完成后显示页面html内容,如下:
Java代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
webView.setWebViewClient(new WebViewClient() {   
    @Override
    public
void onPageFinished(WebView webView, String url){  
        webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml(document.getElementsByTagName(""html"")[0].innerHTML);");  
    }  
});  
此中webView.loadUrl默示调用页面中的js,而页面中的js window.classNameBeExposedInJs.showHtml调用了法度中的java对象的办法,办法参数为一段js。
起首webView会履行这一段js document.getElementsByTagName(""html"")[0].innerHTML。含义即为取得页面中html标识表记标帜的innerHTML,及网页首要内容;
然后将获得的网页内容算作字符串参数传入showHtml办法
最后调用showHtml函数实现,即用AlertDialog显示字符串,如此获得了全部网页的大项目组html代码
5.3.2 WebView显示当前页面的url地址
获得WebView当前页面url应用webView.getUrl()即可,如下:
Java代码  [url=]webview总结 - KidGeek - 等待机遇[/url]
webView.loadUrl("javascript:window.classNameBeExposedInJs.showHtml(""" + webView.getUrl() + """);"); 

 

WebView删除缓存 

1.删除保存于手机上的缓存.
复制到剪贴板  Java代码
// clear the cache before time numDays  
private int clearCacheFolder(File dir, long numDays) {   
int deletedFiles = 0;   
if (dir!= null && dir.isDirectory()) {   
try {   
for (File child:dir.listFiles()) {   
if (child.isDirectory()) {   
deletedFiles += clearCacheFolder(child, numDays);  
}  
  
if (child.lastModified() < numDays) {   
if (child.delete()) {   
deletedFiles++;  
}  
}  
}  
} catch(Exception e) {   
e.printStackTrace();  
}  
}  
return deletedFiles;   
}  
调用:clearCacheFolder(Activity.getCacheDir(), System.currentTimeMillis());//删除此时之前的缓存.
  2. 打开关闭使用缓存:
  优先使用缓存:
  1.WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
  不使用缓存:
  1.WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
  3.在退出应用的时候加上如下代码:
复制到剪贴板  Java代码
File file = CacheManager.getCacheFileBaseDir();  
  if (file != null && file.exists() &&amp; file.isDirectory()) { for (File item : file.listFiles()) { item.delete();  
  }  
  file.delete();  
  }  
  context.deleteDatabase("webview.db");  

  context.deleteDatabase("webviewCache.db"); 

http://hcq0618.blog.163.com/blog/static/17809035120121114114434550/