【2025年4月18日】android studiio最新設置沉浸式狀態欄教程

😫【2025年4月18日】搞了一整天,終于完美搞定 Android 沉浸式狀態欄(WebView + 本地HTML)

最近在做一個個人項目,用 Android 加載本地 HTML 做個小工具。按理說用 WebView 加載頁面很簡單嘛——結果沉浸式狀態欄這個坑,屬實給我干破防了……

🕳? 坑1:狀態欄怎么都不透明

🕳? 坑2:透明了但網頁內容被遮住

🕳? 坑3:參考了N篇博客,全是復制粘貼,沒一個能跑通!

搞了一天一夜,終于悟了,自己親手擼出來一個真正完美兼容 WebView 的沉浸式狀態欄方案。寫這篇就是為了拯救和我一樣被狀態欄折磨的開發者們 🙃


🌈 最終效果(說人話)

  • 狀態欄透明 ?
  • 頁面內容不被遮擋 ?
  • 支持動態適配狀態欄高度 ?
  • 全部代碼簡潔明了,不用配置一堆神秘 style ?

🧠 我的解決方案

  1. 把狀態欄設成透明(但不隱藏);
  2. 把 WebView 填充到全屏;
  3. 加載網頁后,動態設置 HTML 頂部的 padding-top,讓內容往下移動,剛好避開狀態欄!

🧪 完整代碼(就是這貨,拯救了我)

📄 MainActivity.kt

package com.example.testimport android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.View
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Toast
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {private lateinit var webView: WebViewprivate var doubleBackToExitPressedOnce = false@SuppressLint("SetJavaScriptEnabled")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENor View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)window.statusBarColor = Color.TRANSPARENTwebView = WebView(this)setContentView(webView)val webSettings = webView.settingswebSettings.javaScriptEnabled = truewebSettings.loadsImagesAutomatically = truewebSettings.domStorageEnabled = truewebSettings.cacheMode = WebSettings.LOAD_DEFAULTwebSettings.allowFileAccess = truewebSettings.allowFileAccessFromFileURLs = truewebSettings.allowUniversalAccessFromFileURLs = truewebSettings.useWideViewPort = truewebSettings.loadWithOverviewMode = true// 防止跳轉到外部瀏覽器webView.webViewClient = WebViewClient()webView.webViewClient = object : WebViewClient() {override fun onPageFinished(view: WebView?, url: String?) {val height = getStatusBarHeight()webView.evaluateJavascript("document.getElementsByClassName('header')[0].style.paddingTop ='${height}px';",null)}}// 加載本地 HTMLwebView.loadUrl("file:///android_asset/index.html")}override fun onBackPressed() {if (webView.canGoBack()) {webView.goBack()} else {if (doubleBackToExitPressedOnce) {super.onBackPressed()return}this.doubleBackToExitPressedOnce = trueToast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show()Handler(Looper.getMainLooper()).postDelayed({doubleBackToExitPressedOnce = false}, 2000)}}@SuppressLint("DiscouragedApi")fun getStatusBarHeight(): Double {val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")val px = if (resourceId > 0) resources.getDimensionPixelSize(resourceId) else 0val density = resources.displayMetrics.densityval dp = (px / density).toInt() // 轉為邏輯像素return dp*1.2 // 多乘點,保險一點}}

🎨 res/values/themes.xml

<resources xmlns:tools="http://schemas.android.com/tools"><style name="Theme.Test" parent="Theme.AppCompat.NoActionBar"><item name="android:windowNoTitle">true</item><item name="android:windowFullscreen">true</item><item name="windowActionBar">false</item></style>
</resources>


🧩 遇到的幾個“小坑提示”

  • 狀態欄高度是 px,要轉成 dp 后加到網頁上才舒服,不然有時顯示偏差一丟丟。
  • document.getElementsByClassName('header')[0].style.paddingTop ='${height}px';請根據自己的網頁內容來修改(比如給body設置,而不是我這邊的.header的class)

?? 總結

就這么簡單幾步,我終于實現了一個:

  • 沉浸式狀態欄 ?
  • 本地網頁不被遮擋 ?
  • 頁面美觀可控 ?
  • 腳本注入可調節 ?

如果你正好也在做類似項目,希望這篇能給你節省幾個小時人生!


📣 如果你覺得有用

點個贊 ? 收藏一下 💾
關注我,后面會繼續分享更多原生 + 前端混合開發的踩坑記錄!

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

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

相關文章

如何刪除 Launchpad 中 Chrome 的圖標

有一天突然在 Launchpad 中出現下面的圖標&#xff0c;在 Finder 的 Applications 中也沒有&#xff0c;不知道如何刪除。最終在《How to remove chrome app icons from launchpad?》中找到了答案。中文互聯網上并沒有搜到相關帖子&#xff0c;遂作記錄。 解決辦法很簡單&am…

PHP8.2.9NTS版本使用composer報錯,擴展找不到的問題處理

使用composer install時報錯&#xff1a; The openssl extension is required for SSL/TLS protection but is not available. If you can not enable the openssl extension, you can disable this error, at y our own risk, by setting the ‘disable-tls’ option to true.…

一本通 2063:【例1.4】牛吃牧草 1005:地球人口承載力估計

Topic&#xff1a; Ideas&#xff1a; 為什么把這兩道題放在一起呢&#xff1f;就是因為這兩道題很類似&#xff0c;都是很簡單的數學題&#xff0c;只要你會列出數學等式&#xff0c;你就學會這道題了&#xff01; 下面把計算過程展示給大家 Code&#xff1a; //2025/04/18…

基于用戶的協同過濾推薦系統實戰項目

文章目錄 基于用戶的協同過濾推薦系統實戰項目1. 推薦系統基礎理論1.1 協同過濾概述1.2 基于用戶的協同過濾原理1.3 相似度計算方法1.3.1 余弦相似度(Cosine Similarity)1.3.2 皮爾遜相關系數(Pearson Correlation)1.3.3 歐幾里得距離(Euclidean Distance)1.3.4 調整余弦相似度…

【SpringBoot】基于Filter實現SQL注入過濾器

最近掃出了一個SQL注入安全漏洞&#xff0c;用戶的非法輸入可能導致數據泄露、數據篡改甚至系統崩潰&#xff0c;為了有效防范 SQL 注入攻擊&#xff0c;除了在代碼層面使用參數化查詢和預編譯語句外&#xff0c;還可以通過實現一個Filter來過濾掉潛在的危險輸入。本文將介紹如…

Spring Boot 項目里設置默認國區時區,Jave中Date時區配置

在 Spring Boot 項目里設置國區時區&#xff08;也就是中國標準時間&#xff0c;即 Asia/Shanghai&#xff09;&#xff0c;可通過以下幾種方式實現&#xff1a; 方式一&#xff1a;在application.properties或application.yml里設置 application.properties properties sp…

Python環境中在線訓練機器學習模型所遇到的問題及解決方案

我最近開發個智能控制系統,包括實時數據采集、預測、策略優化等功能,最近增加在線學習功能,也就是在線進行模型訓練,在線進行模型訓練時出現了問題,現象為: 控制臺報: cmdstanpy - INFO - Chain [1] start processing所有任務、線程停止,Web服務登錄無法訪問后臺的pyt…

【教程】無視硬件限制強制升級Windows 11

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 1、下載升級工具&#xff1a;https://github.com/builtbybel/Flyby11/releases 2、解壓后打開軟件&#xff1a; 3、拖入win11.iso或者自動下載&#xf…

麥科信汽車診斷示波器在機車維修領域中的應用實例

麥科信汽車診斷示波器在機車維修領域中的應用實例 “Micsig SATO1004的錯誤幀統計功能與歷史波形存儲&#xff0c;讓我們在診斷間歇性CAN故障時有了決定性武器。這不僅是工具升級&#xff0c;更是維修理念的革新。” — Ian Coffey, Mototek技術總監&#xff08;歐洲ECU診…

【IDEA2020】 解決開發時遇到的一些問題

目錄 一、批量更新數據庫數據 逐條更新 Db.updateEntitiesBatch() 二、Error running&#xff0c;Command line is too long. Shorten command line 報錯場景 報錯分析 解決方法 一、批量更新數據庫數據 逐條更新 List<UserModel> ums userMapper.selectListBy…

算法01-最小生成樹prim算法

最小生成樹prim算法 題源&#xff1a;代碼隨想錄卡哥的題 鏈接&#xff1a;https://kamacoder.com/problempage.php?pid1053 時間&#xff1a;2025-04-18 難度&#xff1a;4? 題目&#xff1a; 1. 題目描述&#xff1a; 在世界的某個區域&#xff0c;有一些分散的神秘島嶼&…

cpolar 內網穿透 實現公網可以訪問本機

1、登錄網站&#xff0c;升級成專業版&#xff0c;測試的話建議選一個月付費&#xff0c;選擇預留 2、保留的TCP地址增加一條記錄&#xff0c;描述可以自己取 3、驗證&#xff0c;生成一個Authtocken碼 4、在安裝目錄下&#xff0c;打開CMD命令&#xff0c;復制上面的碼運行aut…

c#內存泄露的原因和解決辦法

內存泄漏的原因 不正確的對象引用&#xff1a;最常見的原因是對象不再需要時未被垃圾回收器回收。例如&#xff0c;如果一個對象被一個不再使用的變量引用&#xff0c;它將不會被垃圾回收。事件訂閱者未取消&#xff1a;如果訂閱了一個事件但沒有在對象不再需要時取消訂閱&…

TDengine Restful 接口API

簡介 為支持各種不同類型平臺的開發&#xff0c;TDengine 提供符合 RESTful 設計標準的 API&#xff0c;即 REST API。為最大程度降低學習成本&#xff0c;不同于其他數據庫 REST API 的設計方法&#xff0c;TDengine 直接通過 HTTP POST 請求 BODY 中包含的 SQL 語句來操作數…

【Contiki】Contiki process概述

00. 目錄 文章目錄 00. 目錄01. 進程類型02. 進程結構03. 事件04. 進程調度函數05. 程序實例06. process實現07. 附錄 01. 進程類型 進程類型主要有**協同式&#xff08;cooperative&#xff09;和搶占式&#xff08;preemptive&#xff09;**兩種。 協同式進程&#xff0c;要…

哪種電腦更穩定?Mac?Windows?還是云電腦? 實測解密

隨著科技的發展進步&#xff0c;電腦已成為當下各類群體的必備產品之一&#xff0c;它的妙用有很多&#xff0c;無論是學生黨、打工人還是已經退休的人群或都離不開它的存在。然而&#xff0c;電腦雖好卻也差異很大、不同品牌、不同系統、不同配置、不同價位的統統都會有區別。…

華為openEuler操作系統全解析:起源、特性與生態對比

華為openEuler操作系統全解析&#xff1a;起源、特性與生態對比 一、起源與發展歷程 openEuler&#xff08;歐拉操作系統&#xff09;是華為于2019年開源的Linux發行版&#xff0c;其前身為華為內部研發的服務器操作系統EulerOS。EulerOS自2010年起逐步發展&#xff0c;支持華…

第 7 期:DDPM 采樣提速方案:從 DDPM 到 DDIM

本期關鍵詞:采樣加速、DDIM 推導、可控性提升、偽逆過程、代碼實戰 前情回顧:DDPM 的采樣瓶頸 在前幾期中,我們構建了一個完整的 DDPM 生成流程。但是你可能已經發現: 生成一張圖像太慢了!!! 原因是: DDPM 要在 T 個時間步中一步步地去噪,從 x_T → x_0。而通常 T 至…

chrome中的copy xpath 與copy full xpath的區別

學過測試或者爬蟲的&#xff0c;都感覺獲取網頁元素&#xff0c;使用xpath最方便 但其中有一些細節可能會使你摸不清頭腦 比如有時候copy xpath會定位不準確&#xff0c;而使用copy full xpath就可以定位 1、copy xpath&#xff08;相對路徑定位&#xff09; 優點&#xff…

學習海康VisionMaster之中線查找

一&#xff1a;進一步學習了 今天學習下VisionMaster中的中線查找&#xff0c;這個就是字面意思&#xff0c;輸入兩條直線&#xff0c;輸出兩條直線的中線 二&#xff1a;開始學習 1&#xff1a;什么是中線查找&#xff1f;今天這個比較簡單&#xff0c;其實這個模塊算是一個幾…