在 res/drawable-hdpi 放置 85849.jpg,程式碼 R.drawable.85849 報錯 cannot be resolved to a variable。
資源檔名必須符合 Java 識別碼命名規則:
[a-zA-Z0-9_]85849 以數字開頭,導致 aapt 無法在 R.java 生成合法欄位名稱。
// 重新命名為以字母開頭
img_85849.jpg
// 或
image_85849.jpg
// 程式碼
R.drawable.img_85849
// assets/images/85849.jpg
InputStream is = getAssets().open("images/85849.jpg");
Bitmap bitmap = BitmapFactory.decodeStream(is);
優點:檔名無限制、支援子目錄、不增加 R 類別體積。缺點:無法用 R.drawable.xxx 靜態引用,打包體積稍大(不經 aapt 優化)。
// res/raw/img_85849.jpg (同樣需合法檔名)
InputStream is = getResources().openRawResource(R.raw.img_85849);
| 目錄 | 生成 R.id | 檔名限制 | 支援子目錄 | 編譯時優化 | 適用場景 |
|---|---|---|---|---|---|
| res/drawable-* | 是 | 嚴格 (Java 識別碼) | 否 | 是 (PNG 壓縮等) | UI 圖片、圖示、可繪製資源 |
| res/raw | 是 | 嚴格 | 否 | 否 (原始封裝) | JSON、XML、短音訊、字體等原始資料 |
| assets | 否 | 無 (任意合法檔名) | 是 | 否 | 大檔案、字體、資料庫種子、HTML 模板、任意命名檔案 |
snake_case、以字母開頭、語義化(如 ic_launcher.png、bg_login.jpg)。res/drawable 放 .webp,體積較 PNG/JPG 小 30%+。drawable-mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi 提供對應解析度,系統自動選擇最佳匹配。資源檔名命名規範是 Android 專案規範的基礎,養成良好習慣能避免大量莫名其妙的編譯錯誤。