一、什么是WebView:
Android内置webkit内核的高性能浏览器,而Webview则是在这个基础进行封装后的一个控件,WebView直译网页视图,我们可以简单看做一个嵌套到View上的一个浏览器!
二、相关方法:
先上官方文档:WebView
并不打算一个个地去讲属性,用到哪个写哪个,其他的自行查阅文档!
除了直接WebView外我们还可以添加你自己的行为,可以自行定制下述类:
WebChromeClient:辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等!
比如下面这些:
方法 | 作用 |
---|---|
onJsAlert(WebView view,String url,String message,JsResult result) | 处理Js中的Alert对话框 |
onJsConfirm(WebView view,String url,String message,JsResult result) | 处理Js中的Confirm对话框 |
onJsPrompt(WebView view,String url,String message,String defaultValue,JsPromptResult result) | 处理Js中的Prompt对话框 |
onProgressChanged(WebView view,int newProgress) | 当加载进度条发生改变时调用 |
onReceivedIcon(WebView view, Bitmap icon) | 获得网页的icon |
onReceivedTitle(WebView view, String title) | 获得网页的标题 |
WebViewClient:辅助WebView处理各种通知与请求事件!
比如下面这些方法:
方法 | 作用 |
---|---|
onPageStared(WebView view,String url) | 通知主程序网页开始加载 |
onPageFinished(WebView view,String url,Bitmap favicon) | 通知主程序,网页加载完毕 |
doUpdateVisitedHistory(WebView view,String url,boolean isReload) | 更新历史记录 |
onLoadResource(WebView view,String url) | 通知主程序WebView即将加载指定url的资源 |
onScaleChanged(WebView view,float oldScale,float newScale) | ViewView的缩放发生改变时调用 |
shouldOverrideKeyEvent(WebView view,KeyEvent event) | 控制webView是否处理按键时间,如果返回true,则WebView不处理,返回false则处理 |
shouldOverrideUrlLoading(WebView view,String url) | 控制对新加载的Url的处理,返回true,说明主程序处理WebView不做处理,返回false意味着WebView会对其进行处理 |
onReceivedError(WebView view,int errorCode,String description,String failingUrl) | 遇到不可恢复的错误信息时调用 |
WebSettings:WebView相关配置的设置,比如setJavaScriptEnabled()设置是否允许JS脚本执行
部分方法如下:
方法 | 作用 |
---|---|
getSettings() | 返回一个WebSettings对象,用来控制WebView的属性设置 |
loadUrl(String url) | 加载指定的Url |
loadData(String data,String mimeType,String encoding) | 加载指定的Data到WebView中.使用”data:”作为标记头,该方法不能加载网络数据.其中mimeType为数据类型如:textml,image/jpeg. encoding为字符的编码方式 |
loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) | 比上面的loadData更加强大 |
setWebViewClient(WebViewClient client) | 为WebView指定一个WebViewClient对象.WebViewClient可以辅助WebView处理各种通知,请求等事件。 |
setWebChromeClient(WebChromeClient client) | 为WebView指定一个WebChromeClient对象,WebChromeClient专门用来辅助WebView处理js的对话框,网站title,网站图标,加载进度条等 |
这里重要区分三个load方法的区别:
loadUrl():直接显示网页内容(单独显示网络图片),一般不会出现乱码。
loadData(data, “text/html”, “UTF-8”):用来加载URI格式的数据,不能通过网络来加载内容,
不能加载图片,而且经常会遇到乱码的问题,我们知道String类型的数据主要是Unicode编码的,
而WebView一般为了节省资源使用的是UTF-8编码,尽管我们按上面写了,但是还需要为webView设置:
webview.getSettings().setDefaultTextEncodingName(“UTF -8”);
loadDataWithBaseURL(baseUrl, string, “text/html”, “utf-8”, null):loadData类的一个
增强类,可以加载图片,baseUrl为你存储的图片路径,而且只需在这里设置utf-8就可以解决乱码
问题了!
这里只是列举了部分属性而已,其他的还需自行查阅官方文档:
WebChromeClient文档WebViewClient文档
WebSettings文档
三、实例:
达到的效果
代码:
package com.example.mycsdn;
import android.app.ActionBar;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class MainActivity extends Activity {
private static long ExitTime = 0;
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar=getActionBar();
webView=new WebView(this);
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
webView.getSettings().setJavaScriptEnabled(true);//设置webView属性,运行JS脚本
webView.loadUrl("http://blog.youkuaiyun.com/xiangyong_1521");//连接
setContentView(webView);//显示
}
/*
* 我们需要重写回退按钮的事件,当用户点击回退按钮判断
* 1、webView.canGoBack()判断网页是否能后退,可以则goback()
* 2、如果不可以,点击两次退出APP,弹出提示Toast
*/
@Override
public void onBackPressed() {
if(webView.canGoBack()){
webView.goBack();
}else{
if(System.currentTimeMillis()-ExitTime>2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", 0).show();
ExitTime=System.currentTimeMillis();
}else{
super.onBackPressed();
}
}
}
}
清单配置文件里在MainActivity里加上: android:theme="@android:style/Theme.Holo.NoActionBar"
隐藏ActionBar。