Android应用访问网页时,可以使用隐式Intent,携带Intent.ACTION_VIEW及Uri信息,
拉起系统的浏览器,从而进行网络访问和内容加载;
除了利用系统浏览器外,应用也可以直接使用WebView进行类似的工作。
本篇博客,主要记录一下Android WebView的基本用法。
1、布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--定义一个ProgressBar指示网页的载入情况-->
<ProgressBar
android:id="@+id/fragment_photo_page_progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
android:background="?attr/colorPrimary"/>
<!--与普通的View一样,直接定义WebView -->
<WebView
android:id="@+id/fragment_photo_page_web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_below="@id/fragment_photo_page_progress_bar">
</WebView>
</RelativeLayout>
2、基本接口的使用
定义好WebView的布局后,需要对WebView进行一些设置,
然后就可以利用WebView加载Uri对应的信息。
下面的代码将使用WebView相关的一些基本的接口:
.............
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_photo_page_webview, container, false);
mProgressBar = (ProgressBar) v.findViewById(R.id.fragment_photo_page_progress_bar);
mProgressBar.setMax(100);
//得到WebView
mWebView = (WebView) v.findViewById(R.id.fragment_photo_page_web_view);
//WebView调用getSettings接口,将获得WebSettings对象
//WebSettings对象可用于修改WebView的一些配置
//这里启用JavaScript,并不是所有网页均需要启动JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
//设置WebChromeClient
//WebChromeClient是一个事件接口,用于响应那些改变浏览器中装饰元素的事件
//包括JavaScript警告信息、网页图标、状态条加载、网页标题刷新等
mWebView.setWebChromeClient(new WebChromeClient() {
//在这里我们重写onProgressChanged,刷新ProgressBar
public void onProgressChanged(WebView webView, int newProgress) {
if (newProgress == 100) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setProgress(newProgress);
}
}
//重写onReceivedTitle,刷新标题栏
public void onReceivedTitle(WebView webView, String title) {
AppCompatActivity activity = (AppCompatActivity) getActivity();
if (activity != null && activity.getSupportActionBar() != null) {
activity.getSupportActionBar().setSubtitle(title);
}
}
});
//设置WebViewClient
//WebViewClient也是一个事件接口,可以实现WebViewClient的各种回调接口来响应各种渲染事件
mWebView.setWebViewClient(new WebViewClient() {
//这里覆盖了shouldOverrideUrlLoading接口
//当有新的URL加载到WebView时,该方法会决定对URL的处理行为
//例如,WebView中加载了一个新的链接时,
//如果该方法返回false,那么用户点击链接后,将由WebView来加载该链接对应的信息
//如果该方法返回true,那么用户点击链接后,WebView就不会加载该链接,程序员必须自己定义处理行为
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return false;
}
});
//设置完WebView后,才能用WebView加载网络信息
mWebView.loadUrl(mUri.toString());
return v;
}
3、处理旋转问题
当使用WebView时,如果设备发生旋转,那么WebView将重新加载网络数据。
因为WebView包含的数据太多,无法在onSaveInstanceState方法中保存;
同时,WebView是视图层的一部分,并不能通过保存Fragment来保存该View。
此时,可以如此配置WebView所在Fragment绑定的Activity:
.............
<activity android:name=".activity.PhotoPageActivity"
android:configChanges="keyboardHidden|orientation|screenSize"/>
.............
android:configChanges属性表明,如果因键盘开或关、屏幕方向改变、屏幕大小改变而发生设备配置更改,
那么activity应自己处理配置更改。
当配置该属性后,旋转屏幕,WebView不会重新加载数据。
不过在一般情况下,不能依赖于android:configChanges属性,
因为使用该属性后,资源修饰符无法自动工作了,同时进程因为内存低被kill后,
UI状态还是会被丢弃掉,因此很多时候还是需要依赖于onSaveInstanceState方法。
4、WebView使用后退键浏览历史网页
当在WebView中点击链接访问网页时,之前的历史信息将被保存。
此时,可以实现后退键访问历史网页的功能。
示例代码如下,我们重写WebView所在Fragment绑定的Activity的onBackPressed方法:
........
@Override
public void onBackPressed() {
WebView webView = ((PhotoPageFragment)mFragment).getWebView();
//canGoBack判断是否有历史信息
if (webView.canGoBack()) {
//如果有的话,就利用goBack回到前一个历史网页
webView.goBack();
} else {
super.onBackPressed();
}
}
.......