2010-08-24 71 views
8

我有一個問題。 Android應用程序的資源:靜態訪問Android應用程序的資源?

我的應用程序有其他問題。模式(編輯/計劃/執行),我想用枚舉類型來描述。我會,不過,想填充字符串從資源string.xml文件阻止枚舉值,即代替

enum Mode { 
    EDIT ("edit"), 
    PLAN ("plan"), 
    EXEC ("exec"); 

    String name; 
    Mode(String name) { this.name = name; } 
    @Override 
     public String toString() { return this.name; } 
}; 

我想寫點東西像:

enum Mode { 
    EDIT (getResources().getText(R.string.mode_edit).toString()), 
    PLAN (getResources().getText(R.string.mode_plan).toString())), 
    EXEC (getResources().getText(R.string.mode_exec).toString())); 

    String name; 
    Mode(String name) { this.name = name; } 
    @Override 
     public String toString() { return this.name; } 
} 

這會例如允許使用資源文件修改模式的名稱,從而允許以後的名稱修改而無需代碼更改,國際化等。

問題是,對資源的標準訪問是通過一個Activity的getResources()方法它只在構造函數中(和實例方法期間)可用。然而,枚舉聲明是類的靜態初始化代碼的一部分。有沒有辦法以靜態方式訪問應用程序的資源?

邁克爾

回答

13
enum Mode { 
    EDIT (R.string.mode_edit), 
    PLAN (R.string.mode_plan), 
    EXEC (R.string.mode_exec); 

    String id; 
    Mode(String id) { this.id = id; } 

    public String getName(Resources r){ return r.getText(id); } 

    @Override 
    public String toString() { return this.name; } 
} 

或者你可以做到以下幾點:

public class ClassName { 
    public static Resources res; 
} 

在你Application.onCreate()Activity.onCreate()

ClassName.res = getResources(); 

,並在您enum Mode

@Override 
    public String toString() { 
     Resources res = ClassName.res; 
     if (res==null){ return super.toString(); } 
     else { return res.getText(id); } 
    } 
0

謝謝,radek-k,爲例子! 與此同時,我提出了一個類似的想法,即我在枚舉中添加了一個靜態方法,然後在Activity的onCreate()方法中傳遞資源句柄。這允許toString() - 方法然後訪問資源字符串。恕我直言,不是很優雅,但它的工作原理...

乾杯, 邁克爾

+1

圍繞這樣的背景下小心通過。你可以打開自己的討厭的內存泄漏。 – Drew 2010-08-27 05:14:18

0

在此基礎上https://stackoverflow.com/a/3560656/262462因爲R.string包含整數

enum Mode { 
    EDIT (R.string.mode_edit), 
    PLAN (R.string.mode_plan), 
    EXEC (R.string.mode_exec); 

    int id; 
    Mode(int id) { this.id = id; } 

    public String toString(Resources r) { return r.getString(id); } 
} 
相關問題