WebView加载方的方式

gbd8 9年前

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访问文件数据

</blockquote>

         setBlockNetworkImage  是否显示网络图像

         setBuiltInZoomControls   设置是否支持缩放

         setCacheMode             设置缓冲的模式

         setDefaultFontSize       设置默认的字体大小

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

         setFixedFontFamily设置固定使用的字体

         setJavaScriptEnabled   设置是否支持Javascript

         setLayoutAlgorithm      设置布局方式

         setLightTouchEnabled   设置用鼠标激活被选项

      setSupportZoom        设置是否支持变焦

WebViewClient就是专门辅助WebView处理各种通知、请求等事件的类。可以通过WebViewsetWebViewClient方法来指定一个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的时候设置了编码方式,但是还是显示乱码,这是因为还需要为WebViewtext编码指定编码方式。举例如下:

               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();方法进行加载。