Android WebView的loadData方法注意事项

  在开发Android平台的互联网应用时,经常会使用到WebView,好处主要有两个,一是可以更改要展现的内容(包括样式),二是可以实现部分功能的跨平台。

       Android的WebView组件使用非常简单,可以使用loadUrl()加载一个Url地址,也可以使用loadData()或loadDataWithBaseURL()加载一段HTML代码片段。loadUrl()的使用大家应该都没有什么问题,但是loadData()和loadDataWithBaseURL()在使用上的差异可能有些人还不太清楚。

       首先,从方法的定义来看:

public void  loadData  (String data, String mimeType, String encoding) public void  loadDataWithBaseURL  (String baseUrl, String data, String mimeType, String encoding, String historyUrl)

       loadDataWithBaseURL()比loadData()多两个参数,可以指定HTML代码片段中相关资源的相对根路径,也可以指定历史Url。两个方法的其余三个参数相同。

       其次,两个方法加载的HTML代码片段有些不同,loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,这就为我们内嵌css等制造了些许麻烦,因为css中经常用'#', '%'等字符,需要如何处理呢?我们需要用UrlEncoder编码为%23, %25, %27, %3f 。


可以设置两个方法,用以限定WebView中的数据内容,保证它们存放在屏幕视野中:
例如:
wv_NewsContent.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
wv_NewsContent.loadDataWithBaseURL(null,newsContent.get(0).getContent(),"text/html", "utf-8",null) ;
        

 loadData()中的html data中不能包含'#', '%', '\', '?'四中特殊字符,出现这种字符就会出现解析错误,显示找不到网页还有部分html代码。需要如何处理呢?我们需要用UrlEncoder编码为%23, %25, %27, %3f 。
可以使用以下两种代码,data为string类型的html代码
 1     webView.loadData(URLEncoder.encode(data, "utf-8"), "text/html",  "utf-8");
这样一些背景效果什么的都不怎么好看了。不推荐。
 2     webView.loadDataWithBaseURL(null,data, "text/html",  "utf-8", null);
这样就会完美解析了。 



 网络内容

    1、LoadUrl直接显示网页内容(单独显示网络图片)

    2、LoadData显示中文网页内容(含空格的处理)

    APK包内文件

    1、LoadUrl显示APK中Html和图片文件

    2、LoadData(loadDataWithBaseURL)显示APK中图片和文字混合的Html内容

    res/layout/main.xml

    Xml代码

        < ?xml version="1.0" encoding="utf-8"?>
        
        < LINEARLAYOUT android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
        
        < WEBVIEW android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/webview" />
        
        < /LINEARLAYOUT>
        
        < ?xml version="1.0" encoding="utf-8"?>
        
        < LINEARLAYOUT android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
        
        < WEBVIEW android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/webview" />
        
        < /LINEARLAYOUT>
        
        Example_webview.java

    Java代码

        package cn.coolworks; 
        
        import java.net.URLEncoder; 
        
        import android.app.Activity; 
        
        import android.os.Bundle; 
        
        import android.webkit.WebView; 
        
        public class Example_webview extends Activity { 
        
        WebView webView; 
        
        final String mimeType = "text/html"; 
        
        final String encoding = "utf-8"; 
        
        /** Called when the activity is first created. */ 
        
        @Override 
        
        public void onCreate(Bundle savedInstanceState) { 
        
        super.onCreate(savedInstanceState); 
        
        setContentView(R.layout.main); 
        
        webView = (WebView) findViewById(R.id.webview); 
        
        webView.getSettings().setJavaScriptEnabled(true); 
        
         // 
        
        //webHtml(); 
        
        // 
        
        //webImage(); 
        
        // 
        
        //localHtmlZh(); 
        
        // 
        
        //localHtmlBlankSpace(); 
        
        // 
        
        //localHtml(); 
        
        // 
        
        // localImage(); 
        
        // 
        
        localHtmlImage(); 
        
        } 
        
        /** 
        
        * 直接网页显示 
        
        */ 
        
        private void webHtml() { 
        
        try { 
        
        webView.loadUrl("http://www.google.com"); 
        
        } catch (Exception ex) { 
        
        ex.printStackTrace(); 
        
        } 
        
        } 
        
        /** 
        
        * 直接网络图片显示 
        
        */ 
        
        private void webImage() { 
        
        try { 
        
        webView 
        
        .loadUrl("http://www.gstatic.com/codesite/ph/images/code_small.png"); 
        
        } catch (Exception ex) { 
        
        ex.printStackTrace(); 
        
        } 
        
        } 
        
        /** 
        
        * 中文显示 
        
        */ 
        
        private void localHtmlZh() { 
        
        try { 
        
        String data = "测试含有 中文的Html数据"; 
        
        // utf-8编码处理(在SDK1.5模拟器和真实设备上都将出现乱码,SDK1.6上能正常显示) 
        
        //webView.loadData(data, mimeType, encoding); 
        
        // 对数据进行编码处理(SDK1.5版本) 
        
        webView.loadData(URLEncoder.encode(data, encoding), mimeType, 
        
        encoding); 
        
        } catch (Exception ex) { 
        
        ex.printStackTrace(); 
        
        } 
        
        } 
        
        /** 
        
        * 中文显示(空格的处理) 
        
        */ 
        
        private void localHtmlBlankSpace() { 
        
        try { 
        
        String data = " 测试含有空格的Html数据 "; 
        
        // 不对空格做处理 
        
        webView.loadData(URLEncoder.encode(data, encoding), mimeType, 
        
        encoding); 
        
        //webView.loadData(data, mimeType, encoding); 
        
        // 对空格做处理(在SDK1.5版本中) 
        
        webView.loadData(URLEncoder.encode(data, encoding).replaceAll( 
        
        "\+", " "), mimeType, encoding); 
        
        } catch (Exception ex) { 
        
        ex.printStackTrace(); 
        
        } 
        
        } 
        
        /** 
        
        * 显示本地图片文件 
        
        */ 
        
        private void localImage() { 
        
        try { 
        
        // 本地文件处理(如果文件名中有空格需要用+来替代) 
        
        webView.loadUrl("file:///android_asset/icon.png"); 
        
        } catch (Exception ex) { 
        
        ex.printStackTrace(); 
        
        } 
        
        } 
        
        /** 
        
        * 显示本地网页文件 
        
        */ 
        
        private void localHtml() { 
        
        try { 
        
        // 本地文件处理(如果文件名中有空格需要用+来替代) 
        
        webView.loadUrl("file:///android_asset/test.html"); 
        
        } catch (Exception ex) { 
        
        ex.printStackTrace(); 
        
        } 
        
        } 
        
        /** 
        
        * 显示本地图片和文字混合的Html内容 
        
        */ 
        
        private void localHtmlImage() { 
        
        try { 
        
        String data = "测试本地图片和文字混合显示,这是APK里的图片"; 
        
        // SDK1.5本地文件处理(不能显示图片) 
        
        // webView.loadData(URLEncoder.encode(data, encoding), mimeType, 
        
        // encoding); 
        
        // SDK1.6及以后版本 
        
        // webView.loadData(data, mimeType, encoding); 
        
        // 本地文件处理(能显示图片) 
        
        webView.loadDataWithBaseURL("about:blank", data, mimeType, 
        
        encoding, ""); 
        
        } catch (Exception ex) { 
        
        ex.printStackTrace(); 
        
        } 
        
        } 
        

        }

你可能感兴趣的:(Android WebView的loadData方法注意事项)