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. Jmeter如何录制APP客户端脚本

    简单五步教大家Jmeter录制APP客户端脚本: Step1 右键单击该测试计划,选择"添加"-"线程组",添加一个线程组. Step2 为了录制客户端的操作, ...

  2. MySQL如何加锁控制并发

    目录 前言 一.乐观锁 添加version字段 二.悲观锁 读锁 全表锁(LOCK TABLE 表 READ) 行锁(SELECT ... LOCK IN SHARE MODE) 写锁 全表锁(LOC ...

  3. 能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法。尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。

    能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法.尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis.MemCa ...

  4. 使用 IPset 进行端口敲门

    端口敲门(Port knocking)技术,即服务通过动态的添加 iptables 规则来隐藏系统开启的服务,使用自定义的一系列序列号来「敲门」,使系统开启需要访问的服务端口,才能对外访问.不使用时, ...

  5. 并发编程:Actors 模型和 CSP 模型

    https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27    

  6. Vue技术点整理-vue.config.js

    1,proxy代理解决本地开发环境跨域问题 配置proxy代理后,proxy会将任何未知请求 (没有匹配到静态文件的请求) 代理到 https://192.168.3.49:8080 vue.conf ...

  7. CSS定位走一波(定位学习续)

    又是新的一周过去了,时间到了,春天绿了,关于HTML5的学习进步了,今天博客更新一些CSS定位的内容,小的一些细节也要牢记,方便做一个更完美的项目. 如何让垂直方向居中,解决方式:在父元素添加over ...

  8. C++类组合问题

    #include <iostream> using namespace std; class Vehicle { public: Vehicle(float speed=0,int tot ...

  9. OSPF优化

    1.点对点(背靠背)的优化 两台设备直连(逻辑上的直连). 将OSPF宣告接口配置为点对点模式,不用选举DR.减少20S时间 interface Ethernet0/1 ip ospf network ...

  10. CF-1332 F. Independent Set

    F. Independent Set 题意 一颗 n 个节点的树,求出每个\(edge-induced~subgraph\)的独立集个数之和. \(edge-induced~subgraph\)含义是 ...