Android WebView的基本用法

Android应用访问网页时,可以使用隐式Intent,携带Intent.ACTION_VIEW及Uri信息,
拉起系统的浏览器,从而进行网络访问和内容加载;
除了利用系统浏览器外,应用也可以直接使用WebView进行类似的工作。

本篇博客,主要记录一下Android WebView的基本用法。


1、布局文件


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    
    <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"/>

    
    <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();
        }
    }
    .......

你可能感兴趣的:(Android开发)