android 之WebView
(一)使用中遇到的问题:
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的更多相关文章
- Android中webView和网页的交互
Android中webView和网页的交互 Android中webView跟网页的交互式通过JavaScript进行的.具体步骤: 1.创建JavaScript,在点击的时候调用JavaScript ...
- Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数
1.主要布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- Android中Webview使用自定义的javascript进行回调
先说为什么需要讨论这个问题. 现在很多的手机应用,都可能会直接嵌入一个web页面.这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端:另一个是功能通用,不仅a ...
- android使用Webview上传图片
package com.example.webview; import java.io.File; import android.net.Uri;import android.os.Bundle;im ...
- Android之 -WebView实现离线缓存阅读
前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有 ...
- 在Android的webview中定做js的alert,confirm和prompt对话框的方法
在Android的webview中定制js的alert,confirm和prompt对话框的方法 http://618119.com/archives/2010/12/20/199.html 1.首先 ...
- Android 响应webview中图片的点击事件
最近碰到个新需求需要点击webview中的图片进行放大显示. 整理了下思路,想到了下面的一个可行的方案. 方案思路, 1.在点击图片的时候调用本地的java方法并给出响应的图片地址 2.本地获得图片地 ...
- android利用WebView实现浏览器的封装
android提供了封装浏览器的接口,可以让开发者利用自己的view显示网页内容.今天又实现研究了一下,利用WebView显示浏览器内容,还可以利用 WebViewClient显示自己需要的内容. 参 ...
- [原][Android]All WebView methods must be called on the same thread.
问题 webView调用JS出错. class TestJS { ...... public TestJS(){ } ...
- android使用webview加载flash文件
android 字段webview几乎实现了浏览器的全部功能,最近在使用webview加载不固定格式的文章,文章中有一部分嵌入了flash,下面就是webview可以进行视频需要进行的设置,代码如下: ...
随机推荐
- CAD使用SetxDataDouble写数据(网页版)
主要用到函数说明: MxDrawEntity::SetxDataDouble 写一个Double扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据 ...
- CAD与用户互在图面上得到一个矩形框(com接口VB语言)
主要用到函数说明: MxDrawXCustomFunction::ExApp_CutDwg 与用户互在图面上得到一个矩形框,详细说明如下: 参数 说明 IN DOUBLE dX1 保存范围的左下角位置 ...
- vue基础---计算属性和侦听器
[一]计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> ...
- The method buildSessionFactory() from the type Configuration is deprecated.SessionFactory的变化
在创建Configuration对象之后:Configuration cfg = new Configuration().configure(); 要通过Configuration创建SessionF ...
- NOIp2017——追求那些我一直追求的
谨以此祭奠我即将爆炸的NOIP2017. $Mingqi\_H\ \ 2017.09.24$ Day -47 突然发现半年来自己从来没有写对过SPFA,最近几天才发现自己的板子一直是错的...赶紧找个 ...
- lucas定理和组合数学
自湖南长沙培训以来的坑...一直未填,今天把这个问题解决掉. 参考: 1.http://www.cnblogs.com/Var123/p/5523068.html 2.http://blog.csdn ...
- 《hello-world》第八次团队作业:Alpha冲刺
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 <hello--worl ...
- Go语言语法说明
Go语言语法说明 go语言中的go func(){}() 表示以并发的方式调用匿名函数func 深入讲解Go语言中函数new与make的使用和区别 前言 本文主要给大家介绍了Go语言中函数new与ma ...
- hdu 5023 线段树延迟更新+状态压缩
/* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N* ...
- [K/3Cloud]如何解决K3Cloud 2.0审批流提交时报“队列不存在,或您没有足够的权限执行该操……
按照图上的操作即可解决不可提交的问题,但如果应用服务器是部署在域环境下,应该不会出错,这是微软support上说的