前言

从事Android以来,几乎离不开WebView的使用。但是使用WebView的过程中,总会出一些令人意想不到的问题,故打算写一篇文章专门用来记录开发过程中遇到的问题吧。如果大家有遇到什么奇怪的问题,欢迎补充完善。

目录

  • 前言
    • WebView多语言如何处理字体反向
    • WebView如何适配暗黑模式
    • WebView 预加载、对象缓存实现
    • WebView如何处理跨域问题

WebView多语言如何处理字体反向

通过改变html dir的属性即可改变文字的方向,比如设置dir="RTL"则表示文字从右往左;

比如: <html dir=\"rtl\" lang=\"\"><body>" + outhtml + "</body></html>

而默认不设置的话,则是从左往右的。

所以如果要对不同的语言进行文字方向适配的话就需要客户端判断当前语言环境下的文字方向了,然后去调整html的文字方向。

而客户端如何判断当前语言文字的方向呢?我直接把代码放到下面了

     if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL){//代表文字从右往左}else{//文字方向从左往右   }

接下来对应调整html的方向了,但是此时分为两种情况。

  1. 直接通过loadDataWithBaseURL加载html代码。
  2. 通过loadUrl直接加载前端URL

第一种比较好解决,直接客户端判断然后手动注入dir="RTL"即可,比如:

     if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL){desc.loadDataWithBaseURL(bull, "<html dir=\"rtl\" lang=\"\"><body>" + outhtml + "</body></html>", "text/html", "UTF-8", null);}else{desc.loadDataWithBaseURL(bull, outHtml, "UTF-8", null);}

第二种这里目前本人没有遇到过,但是无非就是需要通知到html当前文字方向而已,然后他们自己可以根据当前的文字方向去做处理就可以。至于如何通知到html。这个可以和html的研发同学约定,通过JavascriptInterface的方式进行交互即可。这里不再深入展开。

WebView如何适配暗黑模式

这一块再Android10以上Google官方有给出解决方案。利用WebSettingsCompat可以进行设置处理。

怎么使用呢?

首先,引入webkit库。

implementation "androidx.webkit:webkit:1.4.0"

然后再WebView初始化的时候放入如下的代码即可

kotlin版本

if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {Configuration.UI_MODE_NIGHT_YES -> {WebSettingsCompat.setForceDark(myWebView.settings, FORCE_DARK_ON)}Configuration.UI_MODE_NIGHT_NO, Configuration.UI_MODE_NIGHT_UNDEFINED -> {WebSettingsCompat.setForceDark(myWebView.settings, FORCE_DARK_OFF)}else -> {}}
}

java版本

if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {switch (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) {case Configuration.UI_MODE_NIGHT_YES:WebSettingsCompat.setForceDark(myWebView.getSettings(), FORCE_DARK_ON);break;case Configuration.UI_MODE_NIGHT_NO:case Configuration.UI_MODE_NIGHT_UNDEFINED:WebSettingsCompat.setForceDark(myWebView.getSettings(), FORCE_DARK_OFF);break;}
}

更多的使用方式可以参考:Draken web content.

WebView 预加载、对象缓存实现

我们知道对于WebView加载优化来说,有一个很重要优化策略就是WebView的预加载以及对象的缓存,因为WebView过于沉重,导致再构建是耗时比较久。为避免使用时再构建,可以增加预加载以及WebView对象复用。

下面直接放WebView预加载以及复用池工具类,可以直接使用。

class WebViewPool {private val webViewCache: MutableList<WebView> = ArrayList(NUM)fun prepare(context: Context) {if (webViewCache.isEmpty()) {Looper.myQueue().addIdleHandler {webViewCache.add(create(MutableContextWrapper(context)))false}}}fun get(context: Context): WebView {if (webViewCache.isEmpty()) {webViewCache.add(create(MutableContextWrapper(context)))}return webViewCache.removeFirst().apply {val contextWrapper = context as MutableContextWrappercontextWrapper.baseContext = contextclearHistory()resumeTimers()}}fun recycle(webView: WebView) {try {with(webView){stopLoading()loadDataWithBaseURL(null, "", "text/html", "utf-8", null)clearHistory()pauseTimers()webChromeClient = nullwebViewClient = WebViewClient()}val parent = webView.parentif (parent != null) {(parent as ViewGroup).removeView(webView)}} catch (e: Exception) {} finally {if (!webViewCache.contains(webView)) {webViewCache.add(webView)}}}fun destroy() {try {webViewCache.removeAll {it.removeAllViews()it.destroy()false}} catch (e: Exception) {}}private fun create(context: Context) = WebView(context)companion object{const val NUM = 1}
}

WebView如何处理跨域问题

何为跨域?

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

怎么处理呢?

  • 设置webviewsettingallowUniversalAccessFromFileURLs、为true

    settings.allowUniversalAccessFromFileURLs = true
    
  • 如果上述设置还是跨域,那么是不是本来需要网络请求的资源你缓存到本地加载了呢?如果是,则可以直接做如下的设置:

    webResourceResponse.responseHeaders = mapOf("Access-Control-Allow-Origin" to "*","Access-Control-Allow-Headers" to "*","Access-Control-Allow-Credentials" to "true","Access-Control-Allow-Methods" to "POST, PUT, GET, OPTIONS, DELETE")
    

注意:如果设置了可以无限制跨域,从安全层面来说,需要对文件做校验处理,对js调用做鉴权处理。

持续更新…

Android:WebView使用常见问题汇总(持续更新)相关推荐

  1. 【帆软报表】使用技巧及常见问题汇总-持续更新

    [帆软报表]使用技巧及常见问题汇总-持续更新 1.重复与冻结设置,做用:冻结区域 模板-重复与冻结设置 2.单元格有效小数设置 选中单元格-格式-数字-#0.00 3.图表中有效小数设置 图表属性表- ...

  2. Telegram Android源码问题汇总 持续更新

    libtgvoip目录为空 git clone下来的工程中带有submodule时,submodule的内容没有下载下来,执行如下命令 cd Telegram git submodule update ...

  3. Android开发实用工具汇总-持续更新

    OctoTree-Github代码工具树 主页 浏览器插件 octotree 使用 仅在Google Chrome中演示下添加方式,其余浏览器请查看octotree Chrome控件添加地址: htt ...

  4. 【常见问题汇总--持续更新】Keystone常见问题

    http://www.deyisupport.com/question_answer/f/53/t/5396.aspx http://blog.sina.com.cn/s/articlelist_15 ...

  5. iOS精品资源汇总(持续更新)

    文章目录 引言 I.iOS自定义视图相关热门资源 1.1 <用户协议及隐私政策>弹框 1.2 电子签名 1.3 商品详情页 1.4 上传图片视图的封装[支持删除和添加] 1.5 查看风险商 ...

  6. 吉大计算机专硕报录比,22考研院校报录比汇总(持续更新)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 22考研院校报录比汇总(持续更新) 每个考研的小伙伴最关心的就是你所报考学校的报录比,因为这直接关系到你报考院校的难易程度,从中可以看出各高校的整体录取情 ...

  7. Unity学习知识和链接汇总-持续更新

    Unity学习知识和链接汇总-持续更新 Unity Scripting Reference- https://docs.unity3d.com/Manual/index.html gitee http ...

  8. ffmpeg移植Android方法以及常见问题汇总

    ffmpeg移植Android方法以及常见问题汇总: 1.在ffmpeg官网下载源码包,比如ffmpeg-2.3.在ffmpeg目录下增加Android.mk 和av.mk config.sh三个文件 ...

  9. Windows11 Android开发相关记录(持续更新...)

    Windows11 Android开发相关记录(持续更新-) 本章节主要记录安装好Windos系统后开发环境搭建及其心得. 以及开发常用软件和相关配置. 以下属于个人做法,仅供参考: 文章目录 Win ...

  10. 【教程汇总+持续更新】Unity游戏开发从入门到入坟

    新的一年,本该在年前整理的年终总结被拖到了年后开工.去年大量时间投入在Catlike教程的翻译上,截止目前位置,教程的进度已经完全追平原作者. 去年还有一部分是断断续续的更新SLG实战教程,但遗憾的是 ...

最新文章

  1. 马斯克连发三推,发布退出OpenAI内情
  2. 基于图割优化的多平面重建视觉 SLAM(ISMAR2021)
  3. node中npm安装模块的网络问题
  4. 推荐 10 个好用的 Vue3 的开源项目,开发效率又能提升了!
  5. 【数的专题】——欧拉筛
  6. 关于5G技术和5G技术即将面临的各项挑战
  7. 表记录的检索(数据查询)
  8. 程序员相亲的血泪史,千万别做这些事情!
  9. jieba分词工具的使用-python代码
  10. 网络安全攻防实验室通关教程-基础篇
  11. 如何将mpg格式转换为mp4格式?
  12. 用友 U8 word模板修改
  13. html页面调节图片大小,怎么用css设置图片大小?
  14. 擦窗机器人毕业设计_家用擦玻璃清洁机器人结构设计毕业设计说明方案.doc
  15. 如何用c语言编辑定时关机程序有说明的,C语言编写的定时关机程序
  16. Java工具类 - 根据左上角坐标和右下角坐标裁剪图片
  17. google新搜索网站
  18. 计算器算贝塞尔公式_绝版应用!超级好用的计算器!
  19. 云主机装黑果实践(4):阿里轻量机上变色龙bootloader启动问题
  20. 微信小游戏 资源服务器,Cocos Creator 微信小游戏 远程资源设置

热门文章

  1. linux c字符串用0补位,Linux中10个你不知道的命令补齐技巧
  2. 基于Python热点新闻关键词数据分析系统
  3. 愚人节巧用CSS开个极客式玩笑以chrome为例
  4. esp8266舵机驱动_使用Arduino和ESP8266通过网页控制舵机
  5. 华为研究院19级研究员几年心得终成趣谈网络协议文档,附讲解
  6. 为何插入10万数据只需2秒
  7. 73个word使用终极技巧
  8. 【论文学习】G-Rep:面向任意目标检测的高斯表示
  9. Druid配置文件properties的详细配置
  10. 异或鉴相器 matlab 数字鉴相器,一款采用CPLD的光伏并网逆变器锁相及保护电路设计...