1.AndroidManifest.xml中必须使用许可”android.permission.INTERNET”,否则会出Web page not available错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。 webview .getSettings().setJavaScriptEnabled(true);
3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webview的WebView Client对象。mWebView.setWebViewClient(new WebView Client(){
publicbooleanshouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
4.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。[code]public booleanonKeyDown(intkeyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) &&mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
returnsuper.onKeyDown(keyCode, event);
下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了。
看一个实例: public class WebView Demo extends Activity {
privateWebViewmWebView;
private Handler mHandler = new Handler();
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.webview demo);
mWebView = (WebView ) findViewById(R.id.webview );
WebSettingswebSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new Object() {
public void clickOnAndroid() {
mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:wave()");
}
});
}
}, "demo");
mWebView.loadUrl("file:///android_asset/demo.html");
}
} [/code]我们看addJavascriptInterface(Object obj,StringinterfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是interfaceName(demo),作用域是 Global。这样初始化webview后,在webview加载的页面中就可以直接通过javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。
[code]<html>
<script language="javascript">
function wave() {
document.getElementById("droid").src="android_waving.png";
}
</script>
<body>
<a onClick="window.demo.clickOnAndroid()">
<img id="droid" src="android_normal.png"/><br>
第二篇:UIWebView的学习总结
UIWebView的学习总结
我们经常会在应用开发的过程中遇到很多需要用到UIWebView的情况,以前不怎么了解UIWebView,利用工作的间接期,我去针对性地学习了一下这种控件的知识,了解了好多此方面的用途,受益匪浅。
以前我们在做IPTV项目时,在用户登录界面有个悬而未决的功能,我借此拿来试验了一下,通过应用UIWebView实现了用户注册的作用,我们没有必要去专门针对这一项去做一个界面,只需要通过一个按钮引擎触发相应的注册站点信息即可,获取注册站点的Url,打开连接就达到了目的,减少了工作量以及代码量,起到一个两全其美的好处。下面我详细讲解下我自己做得东西:
在一个视图上只需要添加一个按钮,点击按钮就触发了注册站点的URL地址,打开站点就实现了,很实用方便的用法,后来我了解到在TableView的每个cell中都可以添加webview,
自己用uiwebview做一个浏览器,添个返回按钮就是,当然这同时结合了JS(java script),同样可以加载本地的html文件,说到加载本地的html文件,想到以前项目中有个help界面最好用webview来写,这样修改内容只需要更换html文件中的东西就好了,不必要再修改程序代码,加载本地文件我用了这个函数是加载Documents里边的文件,如果是你App内部的,需要改一下代码
NSString *mainBundleDirectory = [[NSBundlemainBundle] bundlePath];
NSString*path=[mainBundleDirectory stringByAppendingPathComponent:docName];
UIWebview的加载方式我一开始了解了两种:一种是通过文件加载,类似在浏览器上输入URL或者本地文件路径
加载代码:
#import "IpadWebViewViewController.h"
@implementation IpadWebViewViewController
@synthesize MyWebview;
// 程序主流程
- (void)viewDidLoad {
// 初始化
[[UIApplicationsharedApplication] statusBarOrientation];
[superviewDidLoad];
// 从 URL 中载入一个 html 页面
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
[self.MyWebviewloadRequest:[NSURLRequestrequestWithURL:url]]; }
还有一种是将一段HTML源码直接赋给UIwebview
代码如下:
#import "IpadWebViewViewController.h"
@implementation IpadWebViewViewController
@synthesize MyWebView;
// 程序主流程
- (void)viewDidLoad {
// 初始化
[[UIApplicationsharedApplication] statusBarOrientation];
[superviewDidLoad];
// 从 APP 包内载入一个 html 页面
NSString *htmlPath = [[[NSBundlemainBundle] bundlePath]
stringByAppendingPathComponent:@"webapp/index.html"];
// NSString *htmlPath = [[[NSBundlemainBundle] resourcePath]
stringByAppendingPathComponent:@"webapp/index.html"];
[self.MyWebviewloadRequest:[NSURLRequestrequestWithURL:
[NSURL fileURLWithPath:htmlPath]]];
}
后来我还知道了可以webview 直接在 UIWebView 中写入一段 HTML 代码htmlPath似乎是一个必须的参数,而 htmlString是可可以直接写成
NSString *htmlString = @”<html ….”;不是必须从一个文件来获取 HTML 串的
#import "IpadWebViewViewController.h"
@implementation IpadWebViewViewController
@synthesize MyWebview;
// 程序主流程
- (void)viewDidLoad {
// 初始化
[[UIApplicationsharedApplication] statusBarOrientation];
[superviewDidLoad];
// 读入一个 HTML
NSString *htmlPath = [[[NSBundlemainBundle] bundlePath]
stringByAppendingPathComponent:@"webapp/loader.html"];
NSString *htmlString = [NSStringstringWithContentsOfFile: htmlPath
encoding:NSUTF8StringEncoding error:NULL];
[self.MyWebviewloadHTMLString:htmlStringbaseURL:[NSURL
fileURLWithPath:htmlPath]];
UIWebView 虽然有很多好处,但是也同样存在缺陷如: 它可能处在一个没有网络的环境中,却在傻傻的等待服务响应。 或是打开一个远端网络时,在数据没有加载前,长时间显示一个白屏(浏览器的个性)。所以针对这个问题我了解了一下也做了实验,在应用程序启动时,我希望去检查一下网络,比如和 Google.com 做一次链接。 如果这个链接正常,那好,APP 可以继续往下工作,但因为这个检测不是一个异步的运行过程,( 我现在还不了解异步启动一个进程的方法) 在等待网络相应过程中,很容易将 APP 卡在启动动画中,而不是停在 Loading 的页面。这个有点像死机的感觉,所以,我希望网络检测不是放在APP 启动过程中,而是 Loading 页面加载完之后。其实苹果在COCOA机制中就已经做了这个处理:下面是我找到苹果中自带的两种方法:
- (void)viewDidLoad
是 APP 在启动时运行的第一个方法
- (void)webViewDidFinishLoad:(UIWebView *)webView
是 UIWebView 每次加载完 HTML时调用一此方法
那么这个问题就解决了,我们在启动应用程序的时候可以检查网络状态
1. 在 View 加载完时,加载 UIWebView 并显示出 Loader 页面
- (void)viewDidLoad {
// 初始化
[[UIApplicationsharedApplication] statusBarOrientation];
[superviewDidLoad];
// 读入一个 HTML
NSString *htmlPath = [[[NSBundlemainBundle] bundlePath]
stringByAppendingPathComponent:@"webapp/loader.html"];
NSString *htmlString = [NSStringstringWithContentsOfFile: htmlPath
encoding:NSUTF8StringEncoding error:NULL];
[self.MyWebviewloadHTMLString:htmlStringbaseURL:[NSURL
fileURLWithPath:htmlPath]];
}
2. 当 loader 页面加载完后,开始作网络检,具体网络检查的代码后面会描述
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 检查网络
BOOL netConnect = [self CheckNetworkStatus];
// 如果网络通畅
if (netConnect == YES) {
// 开始登录
} else {
// 网络链接失败,操作显示
}
}
通过以上的学习我们可以看出应用UIWebview可以很轻松地在应用程序中打开UIL站点地址,访问网络上得网页来进行相关的操作,应用以前网页已经存在的东西,减免了数据平台的冗余,不必要所有东西都通过后台的搭设来实现,而且当遇到问题修改起来也会显得异常方便。
以上就是我最近的收获,希望能通过不断地学习了解更多的东西!