Android 如何使用 WebView 加载 HTML 字符串和处理转译字符

css bug

在 WebView 中编译 Web 应用

如果您希望在客户端应用中提供 Web 应用(或只是网页),则可以使用 WebView 执行该操作。

WebView 类是 Android 的 View 类的扩展,可让您将网页显示为 Activity 布局的一部分。

它不会包含功能全面的网络浏览器的任何功能,例如导航控件或地址栏。

WebView 默认只显示网页。

使用 WebView 非常有用的一种常见情形是,您希望在应用中提供可能需要更新的信息,例如最终用户协议或用户指南。

在 Android 应用中,您可以创建一个包含 WebView 的 Activity,然后使用它来显示在线托管的文档。

另一种 WebView 可能会有所帮助的情形是,如果您的应用向用户提供始终需要互联网连接才能检索数据的数据(例如电子邮件)。

在这种情况下,您可能会发现相比于执行网络请求,然后解析数据并在 Android 布局中呈现数据,在 Android 应用中编译 WebView 以显示包含所有用户数据的网页更加轻松。

您可以改为设计一个专为 Android 设备定制的网页,然后在加载该网页的 Android 应用中实现 WebView。

本文档向您介绍了如何开始使用 WebView 以及如何执行其他操作,例如处理网页导航以及将网页中的 JavaScript 绑定到 Android 应用中的客户端代码。

  1. 在 Activity 布局中添加 WebView

要在布局中为应用添加 WebView,请将以下代码添加到 Activity 的布局 XML 文件中

    <WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
  1. 要在 WebView 中加载网页,请使用 loadUrl()

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://www.example.com");

在 Activity 的 onCreate() 方法中向应用添加 WebView

    WebView myWebView = new WebView(activityContext);
setContentView(myWebView);

使用以下命令加载网页:

    myWebView.loadUrl("https://www.example.com");

通过 HTML 字符串加载网址:

    // Create an unencoded HTML string,
// then convert the unencoded HTML string into bytes, encode
// it with Base64, and load the data.
String unencodedHtml = "&lt;html&gt;&lt;body&gt;'%23' is the percent code for ‘#‘ &lt;/body&gt;&lt;/html&gt;";
String encodedHtml = Base64.encodeToString(unencodedHtml.getBytes(), Base64.NO_PADDING);
// Base64 HTML String
myWebView.loadData(encodedHtml, "text/html", "base64");

注意:此 HTML 可以执行的操作受到限制。如需详细了解编码选项,请参阅 loadData() 和 loadDataWithBaseURL()。

https://developer.android.com/guide/webapps/webview?hl=zh-cn

https://developer.android.com/reference/android/webkit/WebView?hl=zh-cn#loadData


https://developer.android.com/reference/android/webkit/WebView?hl=zh-cn#loadDataWithBaseURL

// baseUrl 可以指定HTML代码片段中相关资源的相对根路径
public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)

solution

  1. WebView 加载 HTML 字符串

  1. 处理转译字符

regex 正则表达式

// &lt; &gt; 替换成对应的 <、>
const left = HTMLString.replaceAll("&lt;", "<"); const right = HTMLString.replaceAll("&gt;", ">"); const html = HTMLString.replaceAll("<img", "<img style='max-width:90%; height:auto;'");

demo

package com.example.webview_app;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;
import android.widget.TextView; public class MainActivity extends AppCompatActivity {
private WebView testWebView;
private TextView testTextView;
// Android 如何使用 WebView 加载 HTML 字符串和处理转译字符
private String htmlString = "&lt;body&gt;&lt;header&gt;&lt;h1&gt;隐私保密条款&lt;/h1&gt;&lt;/header&gt;&lt;main&gt;&lt;article&gt;&lt;h3&gt;六、《隐私保密条款》如何更新&lt;/h3&gt;&lt;p&gt;随着法律法规的出台或修订,本网站的《隐私保密条款》可能会发生变更。条款内容变更后,本网站会以公告或站内信的形式通知用户本网站对条款所做的任何变更,或以其他适当方式提醒用户相关内容的更新。&lt;/p&gt;&lt;h3&gt;七、如何联系客服&lt;/h3&gt;&lt;p&gt;如用户对本《隐私权专项条款》内容有任何疑问、意见或建议,用户可通过客服渠道联系,官方客服电话为:&lt;ahref=&quot;tel:+400-099-8987&quot;&gt;400-099-8987&lt;/a&gt;,同时用户也可以联系本网站的“在线客服”。&lt;/p&gt;&lt;h3&gt;八、法律适用、管辖与其他&lt;/h3&gt;&lt;p&gt;8.1条款之效力、解释、变更、执行与争议解决均适用中华人民共和国法律,如无相关法律规定的,则应参照通用国际商业惯例和(或)行业惯例。&lt;/p&gt;&lt;p&gt;8.2因本条款产生之争议,应依照中华人民共和国法律予以处理,并以上海市闵行区人民法院为第一审管辖法院。&lt;/p&gt;&lt;/article&gt;&lt;/main&gt;&lt;footer&gt;&lt;imgsrc=&quot;https://cdn.xgqfrms.xyz/logo/logo.png&quot;alt=&quot;logo.png&quot;&gt;&lt;pclass=&quot;copyright&quot;&gt;copyright&amp;copy;xgqfrms2020~forever&lt;/p&gt;&lt;/footer&gt;&lt;!--js--&gt;&lt;script&gt;constlog=console.log;&lt;/script&gt;&lt;/body&gt;";
// private static final String htmlString = "
// &lt;body&gt;
// &lt;header&gt;
// &lt;h1&gt;隐私保密条款&lt;/h1&gt;
// &lt;/header&gt;
// &lt;main&gt;
// &lt;article&gt;
// &lt;h3&gt;六、《隐私保密条款》如何更新&lt;/h3&gt;
// &lt;p&gt;随着法律法规的出台或修订,本网站的《隐私保密条款》可能会发生变更。条款内容变更后,本网站会以公告或站内信的形式通知用户本网站对条款所做的任何变更,或以其他适当方式提醒用户相关内容的更新。&lt;/p&gt;
// &lt;h3&gt;七、如何联系客服&lt;/h3&gt;
// &lt;p&gt;如用户对本《隐私权专项条款》内容有任何疑问、意见或建议,用户可通过客服渠道联系,官方客服电话为:&lt;a href=&quot;tel:+400-099-8987&quot;&gt;400-099-8987&lt;/a&gt; ,同时用户也可以联系本网站的“在线客服”。&lt;/p&gt;
// &lt;h3&gt;八、法律适用、管辖与其他&lt;/h3&gt;
// &lt;p&gt;8.1 条款之效力、解释、变更、执行与争议解决均适用中华人民共和国法律,如无相关法律规定的,则应参照通用国际商业惯例和(或)行业惯例。&lt;/p&gt;
// &lt;p&gt;8.2 因本条款产生之争议,应依照中华人民共和国法律予以处理,并以上海市闵行区人民法院为第一审管辖法院。&lt;/p&gt;
// &lt;/article&gt;
// &lt;/main&gt;
// &lt;footer&gt;
// &lt;img src=&quot;https://cdn.xgqfrms.xyz/logo/logo.png&quot; alt=&quot;logo.png&quot;&gt;
// &lt;p class=&quot;copyright&quot;&gt;copyright&amp;copy; xgqfrms 2020 ~ forever&lt;/p&gt;
// &lt;/footer&gt;
// &lt;!-- js --&gt;
// &lt;script&gt;
// const log = console.log;
// &lt;/script&gt;
// &lt;/body&gt;
// "; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidgets(savedInstanceState);
} private void initWidgets(Bundle savedInstanceState) {
testWebView = findViewById(R.id.webView);
testTextView = findViewById(R.id.textView);
// 1. 开启 WebView 对 js 加载的支持
testWebView.getSettings().setJavaScriptEnabled(true);
// 3. WebView 上添加 js 方法的接口实现类(new 实例化)
testWebView.addJavascriptInterface(new JsInterface(), "JsLauncher");
// Java 中定义的接口名, 要在 js 中使用的方法名
// webView.addJavascriptInterface(new jsMethodsObjectInterface(), "jsMethodsObjectName");
// 4. 加载 file:///android_asset/ URL (local html)
// testWebView.loadUrl("file:///android_asset/index.html");
// android_asset 相对目录, android_asset !== android_assets
// 5. 加载 HTTP URL (server html)
// testWebView.loadUrl("https://www.cnblogs.com/xgqfrms/p/12697742.html");
// 6. 加载 HTMl 字符串
// img 自适应 css
// htmlString = htmlString.replaceAll("width=\"\\d+\"", "width=\"100%\"").replaceAll("height=\"\\d+\"", "height=\"auto\"");
htmlString = htmlString.replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"");
// baseUrl 可以指定HTML代码片段中相关资源的相对根路径
// public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl);
testWebView.loadDataWithBaseURL("https://xgqfrms.xyz", htmlString, "text/html", "UTF-8", null);
}
}
"use strict";

/**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2020-10-01
* @modified
*
* @description
* @difficulty Easy Medium Hard
* @complexity O(n)
* @augments
* @example
* @link
* @solutions
*
* @best_solutions
*
*/ const log = console.log; const html = `
&lt;body&gt;
&lt;header&gt;
&lt;h1&gt;隐私保密条款&lt;/h1&gt;
&lt;/header&gt;
&lt;main&gt;
&lt;article&gt;
&lt;h3&gt;六、《隐私保密条款》如何更新&lt;/h3&gt;
&lt;p&gt;随着法律法规的出台或修订,本网站的《隐私保密条款》可能会发生变更。条款内容变更后,本网站会以公告或站内信的形式通知用户本网站对条款所做的任何变更,或以其他适当方式提醒用户相关内容的更新。&lt;/p&gt;
&lt;h3&gt;七、如何联系客服&lt;/h3&gt;
&lt;p&gt;如用户对本《隐私权专项条款》内容有任何疑问、意见或建议,用户可通过客服渠道联系,官方客服电话为:&lt;a href=&quot;tel:+400-099-8987&quot;&gt;400-099-8987&lt;/a&gt; ,同时用户也可以联系本网站的“在线客服”。&lt;/p&gt;
&lt;h3&gt;八、法律适用、管辖与其他&lt;/h3&gt;
&lt;p&gt;8.1 条款之效力、解释、变更、执行与争议解决均适用中华人民共和国法律,如无相关法律规定的,则应参照通用国际商业惯例和(或)行业惯例。&lt;/p&gt;
&lt;p&gt;8.2 因本条款产生之争议,应依照中华人民共和国法律予以处理,并以上海市闵行区人民法院为第一审管辖法院。&lt;/p&gt;
&lt;/article&gt;
&lt;/main&gt;
&lt;footer&gt;
&lt;img src=&quot;https://cdn.xgqfrms.xyz/logo/logo.png&quot; alt=&quot;logo.png&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;copyright&amp;copy; xgqfrms 2020 ~ forever&lt;/p&gt;
&lt;/footer&gt;
&lt;!-- js --&gt;
&lt;script&gt;
const log = console.log;
&lt;/script&gt;
&lt;/body&gt;
`; // copy(html.replaceAll(` `, ``)); const htmlString = html.replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"");
// TypeError: html.replaceAll is not a function // const htmlString = html.replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"");
// TypeError: html.replaceAll is not a function
// const htmlString = html.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\""); let htmlString = ``; if (``.replaceAll) {
htmlString = html.replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&quot;", "\"");
} else {
htmlString = html.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, "\"");
} log(`htmlString =`, htmlString); log(`"".replace`, ``.replace);
log(`"".replaceAll`, ``.replaceAll);
/* "".replace [Function: replace]
"".replaceAll undefined */

Android 上 WebView 图片宽度自适应

多种适配方案

  1. viewport

  2. css media query

  3. img 自适应

refs

https://www.jianshu.com/p/0eb85fc7acc2

https://www.jianshu.com/p/6e69332cf946

String data = Html.fromHtml(content).toString();

data = data.replaceAll("width=\"\\d+\"", "width=\"100%\"").replaceAll("height=\"\\d+\"", "height=\"auto\"");

webview.loadDataWithBaseURL("http://webhost.net", data, "text/html", "UTF-8", null);

webview.getSettings().setJavaScriptEnabled(true);

String varjs = "<script type='text/javascript'>
window.onload = function() {
var $img = document.getElementsByTagName('img');
for(var p in $img){
$img[p].style.width = '100%';
$img[p].style.height ='auto';
}
}
</script>"; webview.loadDataWithBaseURL("http://webhost.net", varjs + data, "text/html", "UTF-8", null);

https://www.jianshu.com/p/a18b70c2fa90



xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


Android 如何使用 WebView 加载 HTML 字符串和处理转译字符的更多相关文章

  1. Android 编程下 WebView 加载一个网页如何得到网页的 Cookie 值

    http://www.cnblogs.com/sunzn/archive/2013/04/03/2998113.html mWebView.setWebViewClient(new MyWebView ...

  2. android开发--使用webView加载tel协议不会打开拨号盘解决

    在加载url之前进行判断,url是否是tel协议开头,然后进行加载,即可打开拨号盘 mWebView.setWebViewClient(new WebViewClient() { @Override ...

  3. Android笔记之WebView加载网页的进度回调

    wv.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, i ...

  4. Android WebView加载本地html并实现Java与JS交互

    最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...

  5. 转:Android Webview 加载外部html时选择加载本地的js,css等资源文件

    原文地址:http://m.blog.csdn.net/blog/qduningning/43196819 在使用WebView加载网页的时候,有一些固定的资源文件如js的jquery包,css,图片 ...

  6. android使用webview加载flash文件

    android 字段webview几乎实现了浏览器的全部功能,最近在使用webview加载不固定格式的文章,文章中有一部分嵌入了flash,下面就是webview可以进行视频需要进行的设置,代码如下: ...

  7. Android开发必知--WebView加载html5实现炫酷引导页面

    大多数人都知道,一个APP的引导页面还是挺重要的,不过要想通过原生的Android代码做出一个非常炫酷的引导页相对还是比较复杂的,正巧html5在制作炫酷动画网页方面比较给力,我们不妨先利用html5 ...

  8. Android:webView加载h5网页视频,播放不了,以及横屏全屏的问题和实现自定义加载进度条的效果

    1.webView加载h5网页视频,播放不了,android3.0之后要在menifest添加硬件加速的属性 android:hardwareAccelerated="true". ...

  9. Android WebView 加载网页

    通过Android 中 WebView 控件加载HTML5 页面,这是实现Android 混合开发的基础. 选择加载的网页可以是本地,也可用使远程的.需要添加访问互联网的权限:<uses-per ...

随机推荐

  1. Connection Manager简称connman

    ConnMan    Connection Manager简称connman,connman是使用d-bus做为进程间通信机制来管理Linux网络链接的一种软件.在connman的d-bus接口中,有 ...

  2. 解析MySQL中存储时间日期类型的选择问题

    解析MySQL中存储时间日期类型的选择问题_Mysql_脚本之家 https://www.jb51.net/article/125715.htm 一般应用中,我们用timestamp,datetime ...

  3. RPC 框架要实现这个功能,我们可以使用泛化调用。那什么是泛化调用呢?我们带着这个问题,先学习下如何在没有接口的情况下进行 RPC 调用。

    RPC 框架要实现这个功能,我们可以使用泛化调用.那什么是泛化调用呢?我们带着这个问题,先学习下如何在没有接口的情况下进行 RPC 调用.

  4. 二进制GCD

    目录 写在前面 具体实现: Code 写在前面 全程抄书 想要进一步提高求 \(\gcd\) 的效率,可以通过不断去除因子 \(2\) 来降低常数,这就是"二进制 \(\gcd\) &quo ...

  5. python yield初探 (转)

    1. iterator叠代器最简单例子应该是数组下标了,且看下面的c++代码: int array[10]; for ( int i = 0; i < 10; i++ )    printf(& ...

  6. Kubernetes -- secret (敏感数据管理)

    https://www.kubernetes.org.cn/secret secret 主要解决密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中 Se ...

  7. 小白搭建WNMP详细教程---MYSQL安装与设置

    MYSQL的安装请参考WAMP中的mysql的安装教程,两者是一样的. https://www.cnblogs.com/missbye/p/12050312.html

  8. Pytest(9)skip跳过用例

    前言 pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能 Skip和xfail: 处理那些不会成功的测试用例 你可以对那些在某些特定平台上不能运行的测试用 ...

  9. Educational Codeforces Round 20

    Educational Codeforces Round 20  A. Maximal Binary Matrix 直接从上到下从左到右填,注意只剩一个要填的位置的情况 view code //#pr ...

  10. hdu2196 Compute

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...