Android WebView 深色模式適配方案總結

Android WebView 深色模式適配方案總結

在 Android WebView 中適配深色模式(Dark Mode)是一個常見的需求,尤其是當加載的網頁沒有原生支持 prefers-color-scheme 時。本文將介紹 3 種主流方案,并分析它們的優缺點,幫助開發者選擇最佳實現方式。


方案 1:JS 動態注入 CSS(適合任意網頁)

核心思路

通過 JavaScript 動態插入 CSS,強制修改網頁的背景、文字顏色等樣式。

代碼實現(Kotlin)

fun applyDarkMode(webView: WebView, isDarkMode: Boolean) {val css = if (isDarkMode) {"""html, body, body * {background-color: #1a1a1a !important;color: #e0e0e0 !important;}/* 隱藏某些元素 */#ad-container { display: none !important; }"""} else {"""html, body, body * {background-color: #ffffff !important;color: #000000 !important;}"""}val js = """var style = document.createElement('style');style.innerHTML = `${css.replace("\n", "")}`;document.head.appendChild(style);""".trimIndent()webView.evaluateJavascript(js, null)
}

調用時機

webView.webViewClient = object : WebViewClient() {override fun onPageFinished(view: WebView?, url: String?) {applyDarkMode(webView, isDarkMode)}
}

優缺點

? 優點

  • 適用于任何網頁(包括第三方網頁)。
  • 可精細控制特定元素的樣式(如隱藏廣告)。

? 缺點

  • 可能受 CSP(內容安全策略)限制,導致注入失敗。
  • 部分網頁可能因 CSS 優先級問題無法覆蓋默認樣式。

方案 2:強制 WebView 深色渲染(API 29+)

核心思路

Android 10 (API 29) 引入了 WebSettingsCompat.FORCE_DARK,可讓 WebView 自動適配深色模式。

代碼實現

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {WebSettingsCompat.setForceDark(webView.settings,if (isDarkMode) WebSettingsCompat.FORCE_DARK_ON else WebSettingsCompat.FORCE_DARK_OFF)
}

適配網頁

網頁需支持 prefers-color-scheme

/* 深色模式適配 */
@media (prefers-color-scheme: dark) {body {background: #121212;color: #f0f0f0;}
}

優缺點

? 優點

  • 系統級支持,兼容性較好(適用于支持 prefers-color-scheme 的網頁)。
  • 無需手動注入 CSS,減少代碼維護成本。

? 缺點

  • 僅適用于 API 29+。
  • 如果網頁未適配 prefers-color-scheme,可能渲染異常。

方案 3:攔截并修改網頁內容(高級方案)

核心思路

通過 WebViewClient.shouldInterceptRequest 攔截 HTML/CSS,動態替換樣式。

代碼示例

webView.webViewClient = object : WebViewClient() {override fun shouldInterceptRequest(view: WebView?,request: WebResourceRequest?): WebResourceResponse? {if (request?.url?.toString()?.endsWith(".css") == true) {// 修改 CSS 內容val darkCss = """body { background: #1a1a1a !important; }""".trimIndent()return WebResourceResponse("text/css","UTF-8",ByteArrayInputStream(darkCss.toByteArray()))}return super.shouldInterceptRequest(view, request)}
}

優缺點

? 優點

  • 可深度定制網頁樣式,甚至替換整個 CSS 文件。
  • 不受 CSP 限制,適用于嚴格安全策略的網頁。

? 缺點

  • 實現復雜,需處理各種資源加載情況。
  • 可能影響網頁功能(如動態加載的樣式)。

最佳實踐推薦

方案適用場景兼容性實現難度
JS 注入 CSS任意網頁,需動態調整樣式所有版本??
WebView 強制深色網頁已支持 prefers-color-schemeAPI 29+?
攔截修改網頁需要深度定制樣式所有版本???

推薦方案

  1. 優先檢查網頁是否支持 prefers-color-scheme,如果支持,使用 方案 2FORCE_DARK)。
  2. 如果網頁不受控(如第三方頁面),使用 方案 1(JS 注入 CSS)。
  3. 如果需要更高級控制(如企業定制頁面),可嘗試 方案 3(攔截修改)。

總結

在 Android WebView 中實現深色模式,主要有 動態注入 CSS系統強制深色渲染攔截修改網頁 三種方式。選擇方案時需考慮:

  • 網頁是否可控(能否修改 CSS?)
  • Android 版本兼容性(是否需要支持舊版?)
  • 是否需要精細控制(如隱藏廣告、修改字體等)

如果你的網頁可控,建議直接使用 prefers-color-scheme + FORCE_DARK;如果是第三方網頁,JS 注入 CSS 是最穩妥的方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84959.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

項目練習:使用mybatis的foreach標簽,實現union all的拼接語句

文章目錄 一、需求說明二、需求分析三、代碼實現四、報表效果 一、需求說明 在sql查詢數據后,對數據分組統計。并最后進行總計。 二、需求分析 最終,我想用sql來實現這個統計和查詢的功能。 那么,怎么又查詢,又統計了&#xf…

7.7 Extracting and saving responses

Chapter 7-Fine-tuning to follow instructions 7.7 Extracting and saving responses 在本節中,我們保存測試集響應以便在下一節中評分,除此之外保存模型的副本以供將來使用。 ? 首先,讓我們簡單看看finetuned模型生成的響應 torch.manu…

計算機網絡第3章(上):數據鏈路層全解析——組幀、差錯控制與信道效率

目錄 一、數據鏈路層的功能二、組幀2.1 字符計數法(Character Count)2.2 字符填充法(Character Stuffing)2.3 零比特填充法2.4 違規編碼法 三、差錯控制3.1 檢錯編碼(奇偶校驗碼)3.2 循環冗余校驗&#xff…

鑄鐵試驗平臺的重要性及應用前景

鑄鐵作為一種重要的金屬材料,在工業生產中扮演著舉足輕重的角色。為了確保鑄鐵制品的質量和性能,鑄鐵材料的試驗是必不可少的環節。而鑄鐵試驗平臺則是進行鑄鐵試驗的關鍵設備之一,它為鑄鐵材料的研究和開發提供了重要的技術支持。本文將探討…

std::shared_ptr引起內存泄漏的例子

目錄 一、循環引用(最常見場景) 示例代碼 內存泄漏原因 二、共享指針管理的對象包含自身的 shared_ptr 示例代碼 內存泄漏(或雙重釋放)原因 三、解決方案 1. 循環引用:使用 std::weak_ptr 2. 對象獲取自身的 …

AI 知識數據庫搭建方案:從需求分析到落地實施

AI 知識數據庫的搭建需結合業務場景、數據特性與技術架構,形成系統化解決方案。以下是一套完整的搭建框架,涵蓋規劃、設計、實施及優化全流程: 一、前期規劃:需求分析與目標定義 1. 明確業務場景與知識需求 場景導向&#xff1a…

Tensorflow 基礎知識:變量、常量、占位符、Session 詳解

在深度學習領域,TensorFlow 是一個廣泛使用的開源機器學習框架。想要熟練使用 TensorFlow 進行模型開發,掌握變量、常量、占位符和 Session 這些基礎知識是必不可少的。接下來,我們就深入了解一下它們的概念、用處,并通過代碼示例進行演示。 一、常量(Constant) 常量,顧…

linux 常見問題之如何清除大文件的內容

linux 常見問題之如何清除大文件的內容 在 Linux 系統中,我們有時會遇到文件隨著時間增長變得巨大,最常見的就是服務器的日志文件,隨著時間的推移占用大量的磁盤空間,下面介紹如何清楚大文件的內容,當然避免文件內容過…

薛定諤的貓思想實驗如何推演到量子計算

前言 這是我的選修課作業,但是我并不喜歡小論文方式的寫法,死板又老套。先在這打一份底稿。 薛定諤的貓 可能一說到量子這個關鍵詞,大家第一時間都會想到的是“薛定諤的貓”。 實驗介紹 薛定諤的貓是一個著名的思想實驗,由奧…

嵌入式開發中fmacro-prefix-map選項解析

在嵌入式開發中,-fmacro-prefix-map 是 GCC 和 Clang 等編譯器提供的一個路徑映射選項,主要用于在預處理階段重寫宏定義中出現的絕對路徑。它的核心目的是解決以下問題: 核心作用 構建可重現性 消除編譯輸出(如 .o、.d 文件&…

Javaweb學習——day3(Servlet 中處理表單數據)

文章目錄 一、概念學習1. GET vs POST 請求方式的區別2. HttpServletRequest 獲取表單數據 二、代碼講解與練習第 1 步:在 webapp 下創建 login.html第 2 步:在 com.example 包下創建 LoginServlet第 3 步:修改 web.xml 注冊 LoginServlet第 …

在 iOS 開發中單獨解析域名為 IP

1 為什么要自己解析? 典型場景說明劫持/污染檢測比較 系統解析 與 自建 DNS 的差異QoS / CDN 選路對每個候選 IP 做 RT/丟包測速系統 API(NSURLSession / Network.framework)在「真正建立連接之前」不會把解析結果暴露出來,因此需要主動解析一步。 2 API 選型概覽 API是否過…

YOLOv1 技術詳解:正負樣本劃分與置信度設計

🔍 YOLOv1 技術詳解:正負樣本劃分與置信度設計 一、前言 YOLOv1 是目標檢測領域中具有劃時代意義的算法之一,它將檢測任務統一為一個回歸問題,實現了“You Only Look Once”的端到端實時檢測。其中,正負樣本的劃分機…

為 Nginx 配置 HTTPS(以 n8n 為例)完整教程【CentOS 7】

在部署如 n8n 這類自動化平臺時,為了保障數據傳輸安全,我們通常會使用 HTTPS 訪問。本文將以 n8n.example.com 為例,介紹如何在 CentOS 7 系統中通過 Nginx 為本地運行在端口 5678 的 n8n 服務配置免費 SSL 證書(Let’s Encrypt&a…

Elasticsearch從安裝到實戰、kibana安裝以及自定義IK分詞器/集成整合SpringBoot詳細的教程ES(四)查詢、排序、分頁、高亮

基礎代碼 package com.test.xulk;import com.alibaba.fastjson.JSON; import com.test.xulk.es.esdoc.HotelDoc; import com.test.xulk.es.service.IHotelService; import org.apache.http.HttpHost; import org.elasticsearch.action.search.SearchRequest; import org.elast…

一個數組樣式上要分成兩個

如圖所示&#xff0c;要有一個區分來顯示&#xff0c;如果一開始就是這樣還可以有很多種處理方式&#xff0c;但是這個后期一直在調整所以不好重做因為開發已經完成&#xff0c;加上很多地方聯動改的地方太多&#xff0c;所以采用了一個比較笨的方法 <ul class"classif…

NLP進化史:從規則模板到思維鏈推理,七次范式革命全解析

“語言不是神的創造物&#xff0c;而是平凡人類的產物。”——諾姆喬姆斯基 自然語言處理&#xff08;NLP&#xff09;的發展史&#xff0c;就是人類試圖教會機器理解語言本質的探索史。本文將帶您穿越70年技術長河&#xff0c;揭示NLP領域關鍵的范式轉換里程碑。 一、規則驅動…

Yarn與NPM緩存存儲目錄遷移

Yarn與NPM緩存存儲目錄遷移 背景與需求 解釋Yarn和NPM緩存機制的作用及默認存儲路徑遷移緩存目錄的常見原因&#xff08;如磁盤空間不足、系統盤性能優化、多項目協作需求&#xff09; Yarn緩存目錄遷移方法 查看當前Yarn緩存目錄的命令&#xff1a;yarn cache dir修改Yarn…

Python爬蟲-批量爬取快手視頻并將視頻下載保存到本地

前言 本文是該專欄的第80篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文筆者以快手為例子,基于Python爬蟲來實現批量采集視頻,并將視頻下載以及保存到本地。 而具體的“視頻采集以及視頻下載,保存”思路邏輯,筆者將在正文中結合“完整代碼”來詳細介紹每個步驟。…

org.springframework.cloud.openfeign 組件解釋

我們來詳細解釋一下 org.springframework.cloud.openfeign 這個組件。 一句話概括&#xff1a;它是一個聲明式的、模板化的HTTP客戶端&#xff0c;旨在讓微服務之間的REST API調用變得像調用本地方法一樣簡單。 為了讓你徹底理解&#xff0c;我會從以下幾個方面來解釋&#x…