1.怎么在webView里加载网页,并且让网页能正常滑动,缩放,可交互?
先写一个布局文件,如下,主要是包含一个WebView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</WebView>
</LinearLayout>
然后Activity的onCreate里调用如下代码:
setWebViewSettings();
setWebClient();
webview.loadUrl("http://www.XXX.com");//要加载的页面
setWebViewSettings()和setWebClient()分别定义如下:
private void setWebViewSettings() {
//获取一个webviewsetting对象
WebSettings setting = webview.getSettings();
//支持JavaScript
setting.setJavaScriptEnabled(true);
//显示缩放控制工具
setting.setDisplayZoomControls(true);
//设置webview支持缩放
setting.setSupportZoom(true);
setting.setBuiltInZoomControls(true);
//设置加载进来的页面自适应手机屏幕
setting.setUseWideViewPort(true);
setting.setLoadWithOverviewMode(true);
}
private void setWebClient() {
webview.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
}
});
}
这样就实现了加载网页的功能,注意页面会全部加载后才会显示出来,所以页面内容太多的话,第一次显示会很慢。
关于设置 WebViewClient 的说明:
1. 若没有设置 WebViewClient 则在点击链接之后由系统处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框。
2. 若设置 WebViewClient 且shouldOverrideUrlLoading方法返回 true ,则说明由应用的代码处理该 url,WebView 不处理。(上面的代码中,返回之前让WebView处理了)
3. 若设置 WebViewClient 且shouldOverrideUrlLoading方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。
如果要实现点击网页里的链接,跳转到app页面,怎么实现?
先准备一个带链接的html页面文件,内容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="m://my.com/">go to app</a><br/>
<a href="m://my.commm/">don't go to app</a><br/>
</body>
</html>
文件中实现了两个链接,其中一个我们想点击后跳转到app页面,另一个不跳转。
然后把文件放到项目的main/assets/文件夹下。如果没有此文件夹可以自己新建。
然后改一下加载网页文件的代码:
String url = "file:///android_asset/test.html";
webview.loadUrl(url);
最后,重写上面提到的方法即可:
webview.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri= Uri.parse(url);
if(uri.getScheme().equals("m")&&uri.getHost().equals("my.com")){
//这里是跳转到app的实现代码,和平时的实现一样就行
//XXX
}else{
view.loadUrl(url);
}
return true;
}
});
2.有时候网页比较大的话,加载很慢,这时候我们想在布局里加一个进度条,用于显示加载网页的进度,怎么做?
先在布局文件里加一个ProgressBar, 样式什么的自己设计,也可以用系统样式。
然后修改代码,findViewById之类的就不用说了,重要的是加上这个:
webview.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if(newProgress==100){
progressBar.setVisibility(View.GONE);//加载完网页进度条消失
}
else{
progressBar.setVisibility(View.VISIBLE);//开始加载网页时显示进度条
progressBar.setProgress(newProgress);//设置进度值
}
}
});
上面代码中的progressBar即为我们添加的进度条。
这样就可以在加载网页时显示进度了。
之前我们的代码里有个webview.setWebViewClient(),这次是webview.setWebChromeClient(),这两个方法有什么区别呢?可以参考前人的文章:
http://blog.youkuaiyun.com/linghu_java/article/details/6927439
3.如果当前处于webView所在页面,用户在按手机返回键时,想要返回上一个网页页面,而不是返回上一个Activity,怎么办?
像下面这样重写onKeyDown()方法即可:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO 自动生成的方法存根
if(keyCode== KeyEvent.KEYCODE_BACK) {
if(webview.canGoBack()) {//当webview不是处于第一页面时,返回上一个页面
webview.goBack();
return true;
}
else {//当webview处于第一页面时,直接退出程序
System.exit(0);
}
}
return super.onKeyDown(keyCode, event);
}
更多设置项,可参考前人总结:http://www.cnblogs.com/bluestorm/archive/2013/04/15/3021996.html