Android Studio 中使用switch語句時報錯Constant expression required的解決方法

Fitz發表於2024-11-23

在工程目錄下第一級的 gradle.properties 中新增 :

android.nonFinalResIds=false

然後Sync Now 重新gradle,就不會再報錯了。

1. Android 專案中,資原始檔(如 R.stringR.layout 等)會在構建時生成對應的 R 類,包含每個資源的唯一 ID。過去,這些資源 ID 預設是 final 的。

  • android.nonFinalResIds=false(舊行為)

    • 所有資源 ID 都會被標記為 final,無法修改。
    • 適合傳統的單模組專案,但在多模組化或動態資源載入中限制較多。
  • android.nonFinalResIds=true(新行為,預設)

    • 資源 ID 不再生成為 final
    • 支援多模組和動態資源載入(如 R8 編譯最佳化和資源分離)。

2. 為什麼要設定 nonFinalResIds

nonFinalResIds 設定為 truefalse 取決於你的專案需求:

true(預設,推薦)

  • 支援 Gradle 資源最佳化(如移除未使用資源)。
  • 更好地支援多模組化開發(模組間的資源訪問)。
  • 減小 APK 檔案大小並最佳化編譯時間。

false(相容性模式)

  • 如果你依賴舊式程式碼邏輯(如硬編碼的資源引用)或某些第三方庫需要 final 資源 ID,則可以設定為 false
  • 在這種模式下,所有資源 ID 都會被標記為 final,確保它們是不可變的。

相關文章