当前位置: 代码迷 >> Web前端 >> 【BUG解决】WebView三个方法区别~解决乱码有关问题
  详细解决方案

【BUG解决】WebView三个方法区别~解决乱码有关问题

热度:593   发布时间:2012-08-22 09:50:35.0
【BUG解决】WebView三个方法区别~解决乱码问题!

最近做WebView加载本地html,发现了网上说的utf-8乱码的问题。解决也很简单,这里有篇很不错的文章写的很详细。偷懒拿来借鉴~!

?

?

其实我发现这不管是在线还是离线显示都可以使用LoadUrl方法!联网时好像是默认utf-8,离线读取本地时需要设置默认编码!如果图片无法离线显示?参考:??http://androidturing.iteye.com/blog/1280946?

?

在网上看了许多关于WebView 的例子。但当自己做起来时,总是有些差别,是另一种体会。这节我就以 模拟器为2.1 为例来讲。

?? WebView 主要调用三个方法:LoadUrl、LoadData、LoadDataWithBaseURL。

???? 1、LoadUrl??????? 直接加载网页、图片并显示。(本地或是网络上的网页、图片、gif)

注意!要提前设置编码:webSettings.setDefaultTextEncodingName("UTF-8");

?

???? 2、LoadData???? 显示文字与图片内容 (模拟器1.5、1.6)

???? 3、LoadDataWithBase? 显示文字与图片内容(支持多个模拟器版本)

下面来看看代码片段:

?

Java代码?
  1. package?com.webviewdemo;??
  2. ??
  3. import?java.net.URLEncoder;??
  4. import?android.app.Activity;??
  5. import?android.os.Bundle;??
  6. import?android.webkit.WebView;??
  7. ??
  8. public?class?WebViewDemo?extends?Activity?{??
  9. ??
  10. ??private?WebView?????MyWebView;??
  11. ??static?final?String?mimeType?=?"text/html";??
  12. ??static?final?String?encoding?=?"utf-8";??
  13. ??
  14. ??/**?Called?when?the?activity?is?first?created.?*/??
  15. ??@Override??
  16. ??public?void?onCreate(Bundle?savedInstanceState)?{??
  17. ????super.onCreate(savedInstanceState);??
  18. ????setContentView(R.layout.main);??
  19. ????//??
  20. ????MyWebView?=?(WebView)?findViewById(R.id.MyWebview);??
  21. ????//?this.webHtml();??
  22. ????//?this.webImage();??
  23. ????//?this.localHtmlZh();??
  24. ????//?this.localImage();??
  25. ????//?this.localHtml();??
  26. ????this.localHtmlImage();??
  27. ??}??
  28. ??
  29. ??/**?
  30. ???*?直接网页显示?
  31. ???*/??
  32. ??private?void?webHtml()?{??
  33. ??
  34. ????try?{??
  35. ??????MyWebView.loadUrl("http://www.google.com");??
  36. ????}?catch?(Exception?ex)?{??
  37. ??????ex.printStackTrace();??
  38. ????}??
  39. ??}??
  40. ??
  41. ??/**?
  42. ???*?直接网络图片显示?
  43. ???*/??
  44. ??private?void?webImage()?{??
  45. ????try?{??
  46. ??????MyWebView?.loadUrl("http://www.google.com.hk/intl/zh-CN/images/logo_cn.gif");??
  47. ????}?catch?(Exception?ex)?{??
  48. ??????ex.printStackTrace();??
  49. ????}??
  50. ??}??
  51. ??
  52. ??/**?
  53. ???*?中文显示?
  54. ???*/??
  55. ??private?void?localHtmlZh()?{??
  56. ????try?{??
  57. ??????String?data?=?"<html>在模拟器?2.1?上测试</html>";??
  58. ??????//?utf-8编码处理(在SDK1.5模拟器和真实设备上都将出现乱码,SDK1.6上能正常显示)??
  59. ??????//?MyWebView.loadData(data,?mimeType,?encoding);??
  60. ??????//?对数据进行编码处理(SDK1.5版本)??
  61. ??????MyWebView.loadData(URLEncoder.encode(data,?encoding),?mimeType,?encoding);??
  62. ??????//?MyWebView.loadDataWithBaseURL(null,?data,?mimeType,?encoding,?null);??
  63. ??
  64. ????}?catch?(Exception?ex)?{??
  65. ??????ex.printStackTrace();??
  66. ????}??
  67. ??}??
  68. ??
  69. ??/**?
  70. ???*?显示本地图片文件?
  71. ???*/??
  72. ??private?void?localImage()?{??
  73. ????try?{??
  74. ??????//?本地文件处理??
  75. ??????String?str?=?"file:///android_asset/icon.png";??
  76. ??????MyWebView.loadUrl(str);??
  77. ????}?catch?(Exception?ex)?{??
  78. ??????ex.printStackTrace();??
  79. ????}??
  80. ??}??
  81. ??
  82. ??/**?
  83. ???*?显示本地网页文件?
  84. ???*/??
  85. ??private?void?localHtml()?{??
  86. ????try?{??
  87. ??????//?本地文件处理(如果文件名中有空格需要用+来替代)??
  88. ??????MyWebView.loadUrl("file:///android_asset/test.html");??
  89. ????}?catch?(Exception?ex)?{??
  90. ??????ex.printStackTrace();??
  91. ????}??
  92. ??}??
  93. ??
  94. ??/**?
  95. ???*?显示本地图片和文字混合的Html内容?
  96. ???*/??
  97. ??private?void?localHtmlImage()?{??
  98. ????try?{??
  99. ??????String?data?=?"<HTML>在模拟器?2.1?上测试,这是<IMG?src=\"APK'>file:///android_asset/igg.jpg\"/>APK里的图片";??
  100. ??????//?SDK1.5本地文件处理(不能显示图片)??
  101. ??????//MyWebView.loadData(URLEncoder.encode(data,?encoding),?mimeType,?encoding);??
  102. ??????//?SDK1.6及以后版本??
  103. ??????//MyWebView.loadData(data,?mimeType,?encoding);??
  104. ??????//?本地文件处理(能显示图片)??
  105. ??????MyWebView.loadDataWithBaseURL(null,?data,?mimeType,?encoding,?null);??
  106. ????}?catch?(Exception?ex)?{??
  107. ??????ex.printStackTrace();??
  108. ????}??
  109. ??}??
  110. }??

?

运行 localHtmlImage(...) 这个方法的结果:


在上面的所有方法中,模拟器2.1下 调用 LoadData 方法总是出现乱码。我想应该是2.1已经不在用它了吧。直接用LoadDataWithBaseURL 方法最简单,不再牵涉编码的转换。

其实我发现这不管是在线还是离线显示都可以使用LoadUrl方法!联网是默认utf-8,离线读取本地时需要设置默认编码!

本地url写法:

手机本地文件:?"file:///data/data/。。。“

SD:?"file:///mnt/sdcard/。。。“

?

如果图片无法离线显示 参考: ?http://androidturing.iteye.com/blog/1280946

?

?

?