访问页面
首先创建WebView 控件并初始化
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.webviewdemo2.MainActivity" >
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
public class MainActivity extends Activity {
<strong>private WebView webView;</strong>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
<strong>webView = (WebView)findViewById(R.id.web_view);</strong>
...
}
}
使用WebView 打开网页,只需要调用它的loadUrl() 方法
webView.loadUrl("http://www.baidu.com");
现在运行一下,就可以发现百度的首页已经被打开了。不过,这时候网页是在系统自带的浏览器中打开的,并不是在WebView中打开的。要想让网页在WebView 中打开,只需要使用setWebViewClient() 方法,为WebView 提供WebViewClient:
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
});
当你不希望网页在外部浏览器打开,重写shouldOverrideUrlLoading() 方法,返回false 就可以了。
最后别忘了在注册清单文件中声明网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
性能优化
另外,如果访问的页面中有JavaScript,必须启用JavaScript 支持:
WebSettings settings = webView.getSettings();
//启用JavaScript支持
settings.setJavaScriptEnabled(true);
设置浏览器优先使用缓存,会在本地产生缓存文件,使网页加载更迅速
//优先使用缓存
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
实现网页回退
如果想要点击返回按钮的时候实现网页的回退,而不是销毁当前的活动,需要重写Activity 的按键事件:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()){
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
获取页面加载进度
可以用WebView 的setWebChromeClient() 方法获得WebChromeClient 对象,并重写它的OnProgressChanged() 方法来获取低昂钱页面的加载进度:
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if(newProgress == 100){
...
}
else{
...
}
}
});
一个完整的例子如下:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.webviewdemo2.MainActivity" >
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS); //启用标题栏的进度条
setContentView(R.layout.activity_main);
webView = (WebView)findViewById(R.id.web_view);
webView.loadUrl("http://www.ted.com/");
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
});
WebSettings settings = webView.getSettings();
//启用JavaScript支持
settings.setJavaScriptEnabled(true);
//优先使用缓存
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
setProgress(0);
//在标题栏中显示网页加载进度
webView.setWebChromeClient(new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if(newProgress == 100){
setProgress(0);
}
else{
setProgress(newProgress * 100);
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()){
webView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}