首页 > 系统 > Android > 正文

Android WebView的基本用法

2019-11-08 00:09:38
字体:
来源:转载
供稿:网友

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(); } } .......
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表