Android WebView的简单使用

  • Post author:
  • Post category:其他



我们在开发中有时候需要在App中加载一些服务器返回的网页链接来展示,但是又不能使用系统的浏览器或者第三方的浏览器来显示。那么我们需要使用到WebView这个控件,那么这个控件怎样去使用呢?


在使用WebView的时候,第一步一定要记得先去AndroidManifest.xml中配置权限




<uses-permission android:name=”android.permission.INTERNET”/>


如果只是简单的加载一个网页去进行展示的话,代码如下:

        String openUrl="http://www.baidu.com";
        WebView mWebView = (WebView)findViewById(R.id.webView);
        mWebView.loadUrl(openUrl);

        //当用户点击一个webView中的页面的链接时,通常,是由默认的的浏览器打开并加载目标URL的
        //然而,你可以在webView中覆盖这一行为,那么链接就会在webView中打开
        mWebView.setWebViewClient(new WebViewClient(){

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //当返回值是true的时候由webView来打开,为false的时候则由第三方或者系统默认的浏览器打开
                view.loadUrl(url);
                return true;
            }
        });

如果你没有setWebViewClient();这个方法的话,你直接使用loadUrl()打开链接话,它就和你直接使用Intent()打开网页一样,会提示你是使用系统浏览器还是第三方浏览器打开。所以,你要是用你自己定义的WebView来打开这个网址的话,一定要记得设置setWebViewClient();为什么呢?因为,WebViewClient是帮助WebView去处理一些页面控制的请求和通知的。在Android中WebView主要负责解析渲染,而WebViewClient和WebChromeClient主要来辅助WebView的。

WebViewClient主要帮WebView处理各种通知和请求事件: onLoadResource, onPageStart, onPageFinished ,onReceiveError等。

WebChromeClient主要帮助WebView处理Javascript的对话框,网站图标,加载进度。比如:onCloseWindow,onJsAlert,onJsPromt等。

在我们实际使用中呢!如果你只是用来处理一些html的页面内容,只用WebViewClient就行了。但是,你要是用到JS,进度条这东西呢,你要使用WebChromeClient了。所以一般的话,我们就只需要使用一些简单的设置就行了。如下代码一般可以使用简单的页面显示了:

        WebView webView= (WebView) findViewById(R.id.webview);
        webView.setWebChromeClient(new WebChromeClient());
        webView.setWebViewClient(new WebViewClient());//.希望点击链接继续在当前browser中响应,必须覆盖 WebViewClient对象。
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl(url);

如果你还需要WebView支持JavaScript,IFrame或者一些框架语法的;则需设置:

   //如果你想要在你的WebView中使用Javascript,你需要启动Javascript.则需要用到WebSttings来启动它。
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);

因为,WebView是默认不支持这些的。设置支持后,还有一个东西你不能忘记,webView.requestFocus()。如果你不设置它的,在页面中是不会弹出软键盘的。

WebView 加载页面主要调用的三个方法:

1.LoadUrl :直接加载网页、图片(包括本地


图片、网络图片、gif图片等等)。

2.LoadData :显示文字与图片内容(模拟器1.5、1.6)。如果要加载图片请不要使用这个方法

3.LoadDataWithBaseURL:显示文字与图片内容。

在使用WebView的时候,可能你需要设置一些特殊的东西,那WebSettings中还提供以下方法:

setJavaScriptEnabled(true);  //支持js

setPluginsEnabled(true);  //支持插件

setUseWideViewPort(false);  //将图片调整到适合webview的大小

setSupportZoom(true);  //支持缩放

setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局

supportMultipleWindows();  //多窗口

setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  //优先使用webview中缓存

  setCacheMode(WebSettings.LOAD_NO_CACHE);//不适用缓存

setAllowFileAccess(true);  //设置可以访问文件

setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点

webview webSettings.setBuiltInZoomControls(true); //设置支持缩放

setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

setLoadWithOverviewMode(true); // 缩放至屏幕的大小

setLoadsImagesAutomatically(true);  //支持自动加载图片

WebViewClient的几个主要方法:

doUpdateVisitedHistory(WebView view, String url, boolean isReload)  //(更新历史记录)

onFormResubmission(WebView view, Message dontResend, Message resend) //(应用程序重新请求网页数据)

onLoadResource(WebView view, String url) // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。

onPageStarted(WebView view, String url, Bitmap favicon) //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。

onPageFinished(WebView view, String url) //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。

onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (报告错误信息)

onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(获取返回信息授权请求)

onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重写此方法可以让webview处理https请求。

onScaleChanged(WebView view, float oldScale, float newScale) // (WebView发生改变时调用)

onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加载时调用)

shouldOverrideKeyEvent(WebView view, KeyEvent event)//重写此方法才能够处理在浏览器中的按键事件。

shouldOverrideUrlLoading(WebView view, String url)

//在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。

下面主要用代码显示一个简单的WebView

1.布局

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

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </WebView>

</RelativeLayout>

2.主要实现方法

package com.example.richard.myapplication;

import android.app.Activity;
import android.app.ProgressDialog;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MainActivity extends Activity {

//    private String openUrl="http://www.baidu.com";
    private WebView mWebView;

    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWebView();
    }

    private void initWebView(){
        String openUrl="http://www.baidu.com";
        mWebView = (WebView)findViewById(R.id.webView);
        mWebView.loadUrl(openUrl);

        //当用户点击一个webView中的页面的链接时,通常,是由默认的的浏览器打开并加载目标URL的
        //然而,你可以在webView中覆盖这一行为,那么链接就会在webView中打开
        mWebView.setWebViewClient(new WebViewClient(){

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //当返回值是true的时候由webView来打开,为false的时候则由第三方或者系统默认的浏览器打开
                view.loadUrl(url);
                return true;
            }
        });

        //WebViewClient帮助webView去处理一些页面控制和请求通知

        //如果你想要在你的WebView中使用Javascript,你需要启动Javascript.则需要用到WebSttings来启动它。
        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

        //3.当你的webView覆盖了URL加载,它会自动生成历史访问记录。你可以通过goBack()或者goForward()向前或者
        //向后反问已经反问过的网点。


        //4.添加一个进度条
        mWebView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                //newProgress是1-100的进度
                if (newProgress == 100) {
                    //网页加载完成
                    endStopProgress();
                } else {
                    //网页正在加载
                    startOpeanProgress(newProgress);
                }
            }
        });


        //5.为了加快网页的加载速度,有一个好的用户体验。我们需要使用到缓存,在WebView中,他默认是不使用缓存的。
        //优先使用缓存 mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        //不使用缓存 mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    }


    private void endStopProgress(){
        if (mProgressDialog!=null && mProgressDialog.isShowing()){
            mProgressDialog.dismiss();
            mProgressDialog=null;
        }
    }


    private void startOpeanProgress(int progress){
        if(mProgressDialog == null) {
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setTitle("正在加载...");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setProgress(progress);
            mProgressDialog.show();
        }else {
            mProgressDialog.setProgress(progress);
        }
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()){
            mWebView.goBack();
            return  true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

上面的代码只是简单的加载一个WebView。其中onKeyDown中方法是让其返回上一次加载的页面,如果没有上一次加载的页面则退出。WebView中还有一些很强大的功能,这里只是简单说明一下使用,如果发现什么不对的地方,请指出,交流交流…
大笑
大笑
大笑



版权声明:本文为richardli1228原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。