Android显示富文本+夜间深色模式
作者:让开,我要吃人了 发布时间:2023-11-11 12:33:59
标签:Android,富文本,深色模式
前言
在工作中有遇到这样的需求,需要把hmtl的富文本内容,进行深色模式适配。原先的富文本内容是在直接在webview上进行展示。
解决思路:替换html中的内容色值。
方案一:
直接使用replace进行字符串替换,当时是去判断、标签,例如下代码
newText.replace("<p>", "<p><span style=\"color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);\">")
存在问题:
替换字符串存在很大的问题,如果原本标签就是已有色值那就会出现问题。所以我这边还是寻找到另外一种方案。
方法二:
在assets中写一个空白页的html文件,html中实现createTable函数,用于接收富文本内容,加载到table标签中,然后在createTable中执行标签识别,添加色值或者替换色值的操作。是否是深色主题的标签可以在Url上拼接获取。
经过测试该方面完美解决问题,后续需求变得也方便添加和修改。下面贴上代码:
<script type="text/javascript">
var type = getQueryString('type');
//获取<body>标签,跟换背景
if (type == 1) {
document.body.style.backgroundColor = "#1F1832";
} else {
document.body.style.backgroundColor = "#F7F8F9";
}
function createTable(text) {
var table = document.getElementById("table");
//获取<body>标签,跟换背景
table.innerHTML = text
//获取p标签,插入添加内容
var list = document.getElementsByTagName("P");
for (var i = 0; i < list.length; i++) {
var spans = list[i].getElementsByTagName("span");
var aTag = list[i].getElementsByTagName("a");
if (aTag.length > 0) {
for (var j = 0; j < aTag.length; j++) {
if (aTag[j].style.backgroundColor == "rgb(255, 255, 255)") {
if (type == 1) {
aTag[j].style.backgroundColor = "rgb(31, 24, 50)";
} else {
aTag[j].style.backgroundColor = "rgb(247, 248, 249)";
}
}
if (aTag[j].style.color == "rgb(51, 51, 51)") {
if (type == 1) {
aTag[j].style.color = "rgb(251, 250, 255)";
}
}
}
}
if (spans.length > 0) {
for (var j = 0; j < spans.length; j++) {
if (spans[j].style.backgroundColor == "rgb(255, 255, 255)") {
if (type == 1) {
spans[j].style.backgroundColor = "rgb(31, 24, 50)";
} else {
spans[j].style.backgroundColor = "rgb(247, 248, 249)";
}
}
if (spans[j].style.color == "rgb(51, 51, 51)") {
if (type == 1) {
spans[j].style.color = "rgb(251, 250, 255)";
}
}
}
} else {
if (type == 1) {
list[i].innerHTML = '<span style="color: rgb(251, 250, 255);">' + list[i].innerHTML;
} else {
list[i].innerHTML = '<span style="color: rgb(31, 24, 50);">' + list[i].innerHTML;
}
}
}
//获取视频标签,添加poster属性
var videos = document.getElementsByTagName("video")
for (var i = 0; i < videos.length; i++) {
videos[i].setAttribute("poster", videos[i].src + '?x-oss-process=video/snapshot,t_1000,f_jpg')
}
}
function getQueryString(name) {
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
var r = window.location.search.substr(1).match(reg);
if (r != null) {
return unescape(r[2]);
}
return 0;
}
</script>
可以在这里写好富文本 kindeditor.net/demo.php
富文本内容:
<p style="text-align:center;">
这
</p>
<p style="text-align:center;">
里
</p>
<p style="text-align:center;">
是
</p>
<p style="text-align:center;">
什
</p>
<p style="text-align:center;">
么
</p>
<p style="text-align:center;">
颜
</p>
<p style="text-align:center;">
色
</p>
<p style="text-align:center;">
!!!
</p>
演示效果:
来源:https://blog.csdn.net/weixin_55362248/article/details/122434315


猜你喜欢
- ServletContext 基础知识获取 ServletContext对象有两种方式可以获取:使用 servletconfig 对象获取使
- 本文实例讲述了Android使用ListView实现下拉刷新及上拉显示更多的方法。分享给大家供大家参考,具体如下:今天得需求是做listvi
- Java下常见的Json类库有Gson、JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进
- 1、super的使用:(1)super是一个关键字。(2)super和this很类似,我们对比着学习。2、先复习一下this关键字的使用。(
- 开发工具:VS2017语言:C#DotNet版本:.Net FrameWork 4.0及以上使用的DLL工具名称:GemBox.Spread
- 本文实例为大家分享了java查找图中两点之间所有路径的具体代码,基于邻接表,供大家参考,具体内容如下图类:package graph1;im
- 一、前言随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了
- Java代码 mvn install:install-file -DgroupId=包名 -DartifactId=项目名 -Dversio
- 在使用struts多模块的,找到一些小技巧和经验,与大家分享一下。 关于多module的配置就不说了,只需要用不同的config
- import java.io.BufferedInputStream;import java.util.ArrayList;import j
- 一、通过程序看现象在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码。这段代码的逻辑很简单:主线程启动了两个子线程,一个
- 1. 前言本节将对 Spring Security 中的密码编码进行一些探讨。2. 不推荐使用md5首先md5 不是加密算法,是哈希摘要。以
- 概念Drawable表示一种可以在Canvas上进行绘制的抽象的概念,它有很多种,常见的如颜色和图片都可以是一个Drawable。优点首先,
- 如今RxJava和Retrofit的结合使用估计已经相当普遍了,自己工作中也是一直都在使用。在使用的过程中我们都会对其进行封装使用,GitH
- 本文实例讲述了C#画图之饼图折线图的实现方法,是C#程序设计中非常实用的技巧。分享给大家供大家参考。具体方法分析如下:显示图像的控件定义如下
- 并发编程中的三个概念:1.原子性在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执
- 一、前言现在在我们的项目中,使用多数据源已经是很常见的,下面,这里总结一下springboot整合jdbcTemplate配置多数据源的代码
- Android application捕获崩溃异常怎么办?通用 application1、收集所有 avtivity 用于彻底退出应用2、捕
- 工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,
- 本文实例讲述了C#泛型委托的用法。分享给大家供大家参考。具体分析如下:冒泡排序大家都知道,例如一个整形数组,可以用冒泡排序来使它按从小到大的