2010-08-24 11 views
8

Yeniden sorun yaşıyorum. Bir Android uygulamasının kaynakları:Bir Android uygulamasının kaynaklarına statik erişim?

Uygulamam yanlış yazılmış. Bir numaralandırma türü kullanarak tanımlamak istediğim modlar (edit/plan/exec). Ben, ancak, kaynak string.xml dosyadan kök dizeleriyle numaralandırma-değerleri doldurmak için, yani yerine

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

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

I gibi bir şey yazmak istiyorum istiyorum:

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; } 
} 

hangi örneğin kaynak ismini kullanarak modların isimlerini değiştirmeye izin verin ve böylece kod değişiklikleri, uluslararasılaştırma vb. olmadan daha sonraki isim değişikliklerine izin verin.

Sorun, kaynaklara standart erişimin bir Activity's getResources() - yöntemiyle yapılmasıdır. Sadece kurucuda kullanılabilir (ve örnek yöntemler sırasında). Ancak, numaralandırma beyanı, bir sınıfın statik başlatma kodunun parçasıdır. Bir uygulamanın kaynaklarına statik bir şekilde erişmenin herhangi bir yolu var mı?

Michael

cevap

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; } 
} 

Alternatif aşağıdakileri yapabilirsiniz: In

public class ClassName { 
    public static Resources res; 
} 

senin Application.onCreate() veya Activity.onCreate():

ClassName.res = getResources(); 

ve

senin enum Mode:

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

Teşekkürler, radek-k, örnekler için! Bu arada kendimi biraz benzer bir fikre kapıldım, daha sonra Aktivite'nin onCreate() - yöntemi sırasında kaynak tanıtıcıyı geçirdiğim enum için statik bir yöntem ekledim. Bu, kaynak dizelerine erişmek için toString() - yöntemine izin verir. IMHO değil çok şık, ama işe yarıyor ...

Alkış, Michael

+1

böyle bağlam etrafında dikkatli geçen olun. Kendinizi kötü bellek sızıntılarına açabilirsiniz. – Drew

0

bu https://stackoverflow.com/a/3560656/262462 dayanarak ve R.string tamsayılar

içerdiğinden
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); } 
}