
從 Android 15 開始,targetSdk 35 以上的 App,畫面會被強制延伸到狀態列和導覽列底下。用 WebView 繪製畫面的 Capacitor App,只要在 capacitor.config.json 把 android.adjustMarginsForEdgeToEdge 設成 "force",讓 WebView 退到系統列內側,再把系統列後面透出的視窗背景塗成 App 的底色,底部按鈕就會重新出現。用像素數字補底部邊距的暫時做法,因為每台手機的系統列高度不同,並不管用。
一顆星的評論
2026 年 11 月 2 日,貓咪《網咖養成記》(PC방 키우기) 的 Google Play 頁面收到一則一星的韓文評論。下面是我們自己翻成中文的內容,原文是韓文。
「遊戲很好玩,但是不符合手機比例。很多家具也移不動。如果遊戲能符合手機比例,應該會看到很多按鈕,覺得很可惜。很好玩,但玩起來不方便,修好了我再玩」
我們當天就回覆道歉,原因也在同一天找到了。這篇是記錄這一天找到了什麼、修了什麼,以及還有什麼不知道。
一顆星的理由不是不好玩,是按鈕
重新讀這則評論,「很好玩」出現了兩次。他不是因為討厭遊戲才給一星,而是該看到的按鈕看不到、家具又移不動,所以沒辦法玩。
對要修的人來說,這種評論反而很感激。說「不好玩」並不會告訴我們該改哪裡,但說「按鈕看不到」,就等於指出該看畫面的哪一排。最後一句也是「修好了我再玩」,代表修好之後他會回來。
差不多同一時間,另外也收到「家具移不動」的回報。追下去發現原因相同,所以把兩張工單合併了。選到家具時,畫面下方會跳出移動、旋轉、收起、賣出四個按鈕排成一排,而那一整排都被擋住了。

Android 15 改了什麼
從 Android 15 開始,以 targetSdk 35 以上建置的 App 會被強制套用 edge-to-edge。App 畫面會一路延伸到上方狀態列和下方導覽列的底下,要怎麼避開被壓在底下的部分,由 App 自己負責。這款 App 的 targetSdk 是 36,所以完全適用。
原生 App 只要接收系統提供的 inset 數值來設定邊距就好。我們的遊戲是在 Capacitor 7 的 WebView 裡繪製,結果在 WebView 端讀到的 env(safe-area-inset-bottom) 是 0。網頁程式碼以為下面沒有系統列,就把分頁列貼到畫面最底端,導覽列便蓋在它上面。
系統列的高度會因導覽方式和機型而不同,所以我推測同一個 App,每個人被擋住的程度也不一樣。這不是我們實際量過的數值。
底部邊距 24px 的補丁為什麼不對
其實這個問題以前就有跡象。程式碼裡有一行加了底部邊距 24px,是因為看起來下面被擋住,所以就先把畫面往上抬一點的暫時補丁。
只靠一個數字是不行的。導覽列的高度因機型、因導覽方式而不同。系統列比 24px 厚就還是會擋住,沒有系統列的環境則會多出一塊沒用的空白。補丁修好了某一台手機,其他手機卻照樣被壓在下面。
所以這次把 24px 那一行刪掉了。我們選的不是讓網頁程式碼去猜邊距,而是改成讓 WebView 一開始就只畫在系統列內側。
修正方法:一行設定、系統列上色,再加一道檢查
修正在 11 月 2 日,也就是評論進來的同一天合併。經營遊戲 App 6 個,以及用來產生新遊戲的範本,都套用了同樣的變更。
第一是在 capacitor.config.json 把 android.adjustMarginsForEdgeToEdge 設成 "force"。這個值會把 WebView 往下推到系統列內側。不選 "auto" 的原因是,auto 在主題裡有 edge-to-edge 退出設定時會失效,而 Android 16 會無視那個退出設定。Android 14 以下的 inset 是 0,所以設成 force 也沒有任何差別。
第二是系統列的顏色。WebView 往內縮之後,這次換成系統列後面會透出視窗背景,預設值是白色,所以深色遊戲的上下就多出白色的帶子。因此我們在建置時加了一支腳本,把 Android 主題的視窗背景、狀態列和導覽列顏色塗成 App 的底色。底色偏暗時,系統列的圖示就保持亮色。android 資料夾每次 sync 都會被重寫,所以把順序綁好,讓這支腳本一定在 sync 之後執行。
第三是防止再發生。我們做了一道檢查,確認每個 App 都有開這個設定,每次 commit 都會跑。還沒開的其他類型 App 有 7 個,把原因寫好後列進了清單,這份清單只能往減少的方向修改。新 App 如果沒帶這個設定進來,檢查就會擋下。
- capacitor.config.json 加上 android.adjustMarginsForEdgeToEdge: "force"
- 把視窗背景和系統列顏色塗成 App 底色(在 sync 之後執行)
- 刪除底部邊距 24px 的暫時補丁
- 逐一確認各 App 有沒有開設定的檢查,以及只能減少的例外清單
還沒量到的事
第一是實機確認。我們手上的測試手機是 Android 14,這個症狀本來就不會出現。修正後的建置,在 Android 15 裝置上用眼睛直接看底部分頁列,這件事還沒做。
第二是結果的數字。修正之後評分變得怎麼樣、那位留言的人有沒有回來,目前都還沒量到。修好才三天,現在拿不出可以用的數字。數字出來之後,我會回來修改這篇文章。
把 35 則評論分類之後
藉這次機會,我們把網咖打工 App 累積的 35 則評論依內容分類。
最多的是完全進不了遊戲的進入失敗,共 27 則。不過 10 月 14 日之後,新進來的進入失敗評論是 0 則。我們把這解讀為上次的修正撐住了。
提到廣告的 2 則裡,有一個問題是剛看完廣告就跳出要求評論的視窗。剛看完廣告的那一刻,是請人給評論最糟的時機。11 月 3 日我們改成廣告結束後 10 分鐘內不詢問評論。
| 分類 | 則數 |
|---|---|
| 進入失敗 | 27 |
| 卡頓 | 3 |
| 廣告 | 2 |
| 存檔 | 1 |
| 操作 | 1 |
| 其他 | 1 |
FAQ
Android 15 為什麼 App 底部按鈕會被導覽列擋住?
從 Android 15 開始,targetSdk 35 以上的 App 會被強制套用 edge-to-edge,畫面一路延伸到系統列底下。App 如果沒有照系統列的高度留邊距,最下面的按鈕就會被壓在導覽列底下。
Capacitor App 的 adjustMarginsForEdgeToEdge 要怎麼設定?
在 capacitor.config.json 的 android 項目裡加上 adjustMarginsForEdgeToEdge。《網咖養成記》(PC방 키우기) 設成 "force"。"auto" 在主題有 edge-to-edge 退出設定時會失效,而 Android 16 會無視退出設定,所以選了 force。
底部邊距直接用像素加上去不行嗎?
系統列的高度會因機型和導覽方式而不同,只靠一個數字對不上。這款 App 以前也有加 24px 的暫時補丁,但碰到比較厚的系統列還是會擋住,這次已經刪掉了。
把 WebView 退到系統列內側之後,上下出現白色的帶子怎麼辦?
那是系統列後面透出的視窗背景,預設的視窗背景是白色。把 Android 主題的視窗背景、狀態列和導覽列顏色調成 App 的底色就會消失。Capacitor 在 sync 時會重寫 android 資料夾,所以上色的步驟要放在 sync 之後。
更多文章
比較溫泉與澡堂題材的遊戲8款,用商店標示比較溫泉、澡堂題材的遊戲,依 Steam、Google Play、App Store 原文標示排成一張表。價格、評價、是否放置、有沒有韓文與日文都列出,也寫了我們自己遊戲的弱點。
比較離線也能玩的放置經營手遊,用商店標示篩出的8款放置經營手遊哪些能離線玩?依 Google Play 與 App Store 原文標示,把標籤、說明、價格、廣告列成一張表,也寫出我們自己遊戲的弱點。
類似遊戲開羅遊戲玩完了:依喜歡的味道挑下一款,共14款玩過一輪開羅遊戲(Kairosoft)的人,下一款可以從「短時間慢慢養、經營小店照顧員工、看居民的人生、擺設搭配益智」四個方向挑。我們確認了14款遊戲的Steam定價、評價與介面語言。
比較網咖經營遊戲 2026,連 iPhone 也有的 17 款想找網咖模擬器?我們挑出 iPhone、Android、Steam 共 17 款網咖經營遊戲,附上直接在商店頁面讀到的價格、評分、離線標示,也寫出我們自家遊戲的缺點。