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. 前端面试之JavaScript中的闭包!

    前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...

  2. Bitter.Core系列 十二 :Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore 之 支持的 where 条件表达式

    Bitter.Core 内置了支持大部分的 linq 的条件表达式.基本上符合我们 where 条件所需.Bitter.Core 的支持 表达式内置  扩展 有: EndsWith    在Sql 解 ...

  3. (转载)微软数据挖掘算法:Microsoft 线性回归分析算法(11)

    前言 此篇为微软系列挖掘算法的最后一篇了,完整该篇之后,微软在商业智能这块提供的一系列挖掘算法我们就算总结完成了,在此系列中涵盖了微软在商业智能(BI)模块系统所能提供的所有挖掘算法,当然此框架完全可 ...

  4. CF175C Geometry Horse 题解

    "日拱一卒,功不唐捐" 写在前面 本人因为没开long long而被迫参考楼下思路重构代码,最后发现这个问题加了long long才得以AC 进入正题 -->这是题面 这是百 ...

  5. loj10087

    Southwestern Europe 2002,题面可参考 POJ 1201. 给定 n 个闭区间 [a_i,b_i] 和 n 个整数c_i .你需要构造一个整数集合Z ,使得对于任意i (1< ...

  6. centos编译安装vim7.4

    ./configure --with-features=huge --enable-fontset --enable-gui=gtk2 --enable-multibyte --enable-pyth ...

  7. unix环境高级编程第六章笔记

    口令文件 阴影口令 组文件 附属组ID 登录账户记录 系统标识 口令文件<\h2> /etc/passwd文件是UNIX安全的关键文件之一.该文件用于用户登录时校验用户的口令,文件中每行的 ...

  8. 2020ICPC·小米 网络选拔赛第一场 A.Intelligent Warehouse (DP)

    题意:给你一组数,选一些数出来组成一个排列,使得每个数都能被前一个数整除,求排列的最大元素. 题解:我们先用欧拉筛筛出\(1e7\)的质数,设\(dp[i]\)表示当前选的数都是\(i\)的约数且合法 ...

  9. Strategic game POJ - 1463 dfs

    题意+题解: 1 //5 2 //1 1 3 //2 1 4 //3 1 5 //1 1 6 //给你5个点,从下面第二行到第五行(称为i行),每一行两个数x,y.表示i和x之间有一条边.这一条边的长 ...

  10. 向Pycharm中导入第三方包 && 更改Pycharm上镜像源

    一.Pycharm本身导包 下载成功会这个样子(如下图) 但是有时因为包的版本太高,代码运行出错,此时需要选中右下角的Specify version,然后选择想要的版本即可 如果还出错,那就在命令行下 ...