專案需支援手機與平板等多種螢幕尺寸,部分介面在平板上擁有額外按鈕與視圖,希望在同一 Activity 中根據裝置類型執行不同程式碼分支,而非維護多套 Activity。
Android 資源系統支援依螢幕尺寸載入不同數值,利用 values、values-large、values-sw600dp 等限定符目錄,定義同名但不同值的 bool 資源,程式碼中統一讀取即可。
res/values/booleans.xml <!-- 手機預設 -->
res/values-sw600dp/booleans.xml <!-- 7 吋以上平板 -->
res/values-large/booleans.xml <!-- 大螢幕裝置 -->
<!-- res/values/booleans.xml -->
<resources>
<bool name="isTablet">false</bool>
</resources>
<!-- res/values-sw600dp/booleans.xml -->
<resources>
<bool name="isTablet">true</bool>
</resources>
public static boolean isTablet(Context context) {
return context.getResources().getBoolean(R.bool.isTablet);
}
// 使用範例
if (isTablet(this)) {
// 平板專用邏輯:顯示雙欄布局、啟用拖放、載入額外 Fragment
setupTabletUI();
} else {
// 手機邏輯:單欄、底部導航
setupPhoneUI();
}
若邏輯差異極大,建議採用「策略模式」:
public interface UiStrategy {
void setupUI(Activity activity);
}
public class PhoneStrategy implements UiStrategy { ... }
public class TabletStrategy implements UiStrategy { ... }
// 依資源決定實例
UiStrategy strategy = isTablet(context) ? new TabletStrategy() : new PhoneStrategy();
strategy.setupUI(this);
sw600dp、sw720dp 等 最小寬度限定符 比 large/xlarge 更精準,建議優先使用。booleans.xml),系統才會自動依限定符選擇正確值。getResources(),需在 Context 可用後(如 onCreate)執行。| 方案 | 優點 | 缺點 |
|---|---|---|
| 布林資源(本文) | 零反射、編譯期安全、效能最佳 | 僅適合簡單分支 |
| 反射載入不同 Class | 完全隔離程式碼 | 易出錯、ProGuard 需額外配置、除錯困難 |
| 多 Module + flavor | 建構產物分離 | 專案結構複雜、建置時間增加 |
對於「同一 Activity 微調邏輯」的需求,布林資源法是最輕量且符合 Android 設計哲學的做法。