WebView加载方的方式

论坛: 

WebView加载有3中方式:
            1> WebView .loadUrl(String strhtml); 用于加载网页的内容,注意需要加权限  ""
                本地连接放在assets文件下, WebView.loadUrl("file:///android_aasset/html/")
            2>   WebView .loadData(String data, String mimeType, String encoding);
                    data:文件要加载的网络内容
                    mimeType 加载网页内容的类型(type/html,image/jpeg)
                    encoding  加载网络内容所设置的编码格式(gbk/utf-8);
            3>   LoadDataWithBaseURL()
                一般用WebView.loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String              
                historyUrl)     跟loadData相比,优先选择

    一般要支持js,要设置      WebSessings  settings=webview.getAebSettings();   要设置其属性

   WebSettings, WebViewClient, WebChromClient相对于WebView的功能

    1  .   WebSetting是用于设置WebView的实行和状态,

          WebSettings webSettings=mWebView.getSettings();

      //设置支持js *****************必须设置,默认值为false

            settings.setJavaScriptEnabled(true);

            //设置支持缩放

            settings.setBuiltInZoomControls(true);

            //设置支持加载图片

      wSet.setBlockNetworkImage(false);

            //设置支持缓存

            settings.setAppCacheEnabled(true);

            //设置缓存模式为默认

            settings.setCacheMode(WebSettings.LOAD_DEFAULT);

      settings.setCacheMode(WebSettings.LOAD_DEFAULT);

        setAllowFileAccess   启用或禁止WebView访问文件数据

             setBlockNetworkImage  是否显示网络图像

             setBuiltInZoomControls   设置是否支持缩放

             setCacheMode             设置缓冲的模式

             setDefaultFontSize       设置默认的字体大小

             setDefaultTextEncodingName  设置在解码时使用的默认编码

             setFixedFontFamily设置固定使用的字体

             setJavaScriptEnabled   设置是否支持Javascript

             setLayoutAlgorithm      设置布局方式

             setLightTouchEnabled   设置用鼠标激活被选项

          setSupportZoom        设置是否支持变焦

    WebViewClient就是专门辅助WebView处理各种通知、请求等事件的类。可以通过WebView的setWebViewClient方法来指定一个WebViewClient对象。WebViewClient提供了如下的一些方法,我们可以覆盖这些方法来辅助WebView浏览网页,代码如下(我们设置覆盖shouldOverrideUrlLoading方法,使得当有新连接时,使用当前的WebView来显示):

             public boolean shouldOverrideUrlLoading(WebView view,String url){

                   view.loadUrl(url);

                   return true;

             }默认值为true------阻止   ,表示当前连接不能再当前wenView中加载,false表示拦截

             onPageFinished          网页加载完毕

             onPageStarted            网页开始加载

             onReceivedError          报告错误信息

             onScaleChanged          WebView发生改变

             shouldOverrideUrlLoading 控制新的连接在当前WebView中打开

    补充:对”Back”按键的处理:如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个webView进程会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。

    覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。

            webview.goBack(); //goBack()表示返回webView的上一页面

    经过实践,笔者发现,loadData不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使用loadDataWithBaseURL。

    2.      许多实用loadData方法的朋友都遇到显示乱码的问题,那是因为编码器设置错误导致的。我们知道String类型的数据主要是unicode编码,而WebView一般为了节省资源使用的是UTF-8编码,所以我们在loadData的时候要告诉方法怎样转码。即要告诉它要将unicode编码的内容转成UTF-8编码的内容。有些朋友虽然在loadData的时候设置了编码方式,但是还是显示乱码,这是因为还需要为WebView的text编码指定编码方式。举例如下:

                   WebView wv = (WebView)findViewById(R.id.webview) ;

                    String content = getUnicodeContent() ;

                   wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;

                   wv.loadData(content, “text/html”, “UTF-8”) ;
    代码如下:

    WebSettings wSet = wView.getSettings(); 
    wSet.setJavaScriptEnabled(true);
    //设置支持缩放
    wSet.setBuiltInZoomControls(true);
            //设置支持加载图片
    wSet.setBlockNetworkImage(false);
            //设置支持缓存
    wSet.setAppCacheEnabled(true);
            //设置缓存模式为默认
    wSet.setCacheMode(WebSettings.LOAD_DEFAULT);
    wSet.setCacheMode(WebSettings.LOAD_DEFAULT);
    mt_rel = (RelativeLayout) findViewById(R.id.mt_rel);
    // 创建WebViewClient对象
    WebViewClient wvc = new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    // 使用自己的WebView组件来响应Url加载事件,而不是使用默认浏览器器加载页面
    wView.loadUrl(url);
    // 记得消耗掉这个事件。给不知道的朋友再解释一下,Android中返回True的意思就是到此为止吧,事件就会不会冒泡传递了,我们称之为消耗掉
    return true;
    }


    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    }


    @Override
    public void onPageFinished(WebView view, String url) {
    //Toast.makeText(getApplicationContext(), "WebViewClient.onPageFinished", Toast.LENGTH_SHORT).show();
    super.onPageFinished(view, url);
    mCustomDialog.dismiss();;
    }




    @Override
    public void onLoadResource(WebView view, String url) {
    //Toast.makeText(getApplicationContext(), "WebViewClient.onLoadResource", Toast.LENGTH_SHORT).show();
    super.onLoadResource(view, url);
    }
    @Override
    public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {
    //Toast.makeText(getApplicationContext(), "WebViewClient.onReceivedError", Toast.LENGTH_SHORT).show();
    super.onReceivedError(view, errorCode, description, failingUrl);
    }
    @Override
    public void onScaleChanged(WebView view, float oldScale, float newScale) {
    //Toast.makeText(getApplicationContext(), "WebViewClient.onScaleChanged", Toast.LENGTH_SHORT).show();
    super.onScaleChanged(view, oldScale, newScale);
    }
    };


//webView的缓存:点击返回键

/**
     * WebView对于Back按键的响应是整个退出,如果希望一级一级退出,则需要监听Back按键
     * 监听按键弹起的状态
     * 返回值 true表示在此拦截,不再向下传递
     */
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
     Log.d(TAG, "onKeyUp keyCode: " + keyCode);
     if(keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()){
      mWebView.goBack();
      return true;
     }
     return super.onKeyUp(keyCode, event);
    }


由此可见:

loadData("<html><head>test<a href=\"http://wap.bai.com\">中文</a></html>", "text/html", "UTF-8");

最好使用: LOadDataWithBaseUrl();方法进行加载。


Tags: