WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用。
1.因为使用的是网页,故需要赋予网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
2.XML布局文件
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
3.加载本地html资源方式(assets)
webView.loadUrl("file:///android_asset/helloword.html");
4.加载网络网页方式
webView.loadUrl("http://www.baidu.com");
5.设置网页在WebView显示
webView.setWebViewClient(new WebViewClient());
6.对网页进行一定的配置(如点击事件需要开启 JS 功能)
//获取配置对象
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true); //允许加载javascript
settings.setSupportZoom(true); //允许缩放
//settings.setBuiltInZoomControls(true); //原网页基础上缩放
settings.setUseWideViewPort(true); //任意比例缩放
setting.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//优先使用缓存
//setting.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存
7.退出时销毁
rootLayout.removeView(webView);//先解除绑定
webView.destroy();//activity销毁的时候销毁webView
/**
* 有一定效果,但是不一定有用
* webView.stopLoading();
webView.loadUrl("");
webView.reload();
webView.destroy();
*/
8.webView有两个方法:setWebChromeClient 和 setWebClient
setWebClient:主要处理解析,渲染网页等浏览器做的事情
setWebChromeClient:辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等。
附测试代码
public class MainActivity extends AppCompatActivity {
private WebView webView;
private ProgressBar progressBar;
private RelativeLayout layout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
layout = (RelativeLayout) findViewById(R.id.activity_main);
setWebView();
}
/***
* 设置webView相关操作
*/
private void setWebView() {
//获取配置对象
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true); //允许加载javascript
settings.setSupportZoom(true); //允许缩放
//settings.setBuiltInZoomControls(true); //原网页基础上缩放
settings.setUseWideViewPort(true); //任意比例缩放
settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//优先使用缓存
//开始加载网页,只用此方法加载会默认向浏览器跳转,如果需要在WebView上显示,
//则需要调用setWebViewClient();
//webView.loadUrl("file:///android_asset/error.html");
webView.loadUrl("http://www.baidu.com");
//设置网页在WebView显示
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
progressBar.setVisibility(View.GONE);
webView.loadUrl("file:///android_asset/error.html");
}
});
//webView辅助
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
progressBar.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
}
});
//webView.loadUrl("file:///android_asset/example.html");
}
@Override
public boolean onKeyDown(int keyCoder, KeyEvent event) {
if (webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
webView.goBack(); //goBack()表示返回webView的上一页面
return true;
}
return false;
}
@Override
protected void onDestroy() {
/**
* webview调用destory时,webview仍绑定在Activity上.这是由于自定义webview构建时
* 传入了该Activity的context对象,因此需要先从父容器中移除webview,然后再销毁
* webview:
*/
layout.removeView(webView);
webView.destroy();//activity销毁的时候销毁webView
/**
* 有一定效果,但是不一定有用
* webView.stopLoading();
webView.loadUrl("");
webView.reload();
webView.destroy();
*/
super.onDestroy();
}
}
Xml代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.yt.cs.test_webview.MainActivity">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="48dp"
android:visibility="gone"
android:layout_height="48dp"
android:layout_centerInParent="true"
android:background="@null" />
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
</RelativeLayout>