Android WebView的基本用法

来源:互联网 发布:种植牙 植骨 知乎 编辑:程序博客网 时间:2024/05/20 04:28

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();        }    }    .......
0 0
原创粉丝点击