从非活动类获取资源

时间:2014-07-15 14:19:46

标签: java android enums resources android-context

我有一个特殊的类,它包含静态信息并根据特殊情况进行计算。这是一个特殊的自定义类,不会扩展活动的任何部分或Android环境。

因为类从未真正实例化,所以它主要在static级别引用。这对我来说仍然很重要,因为我拥有一些对应用程序流程至关重要的static enums

这是问题所在: 因为该类没有扩展android活动生命周期,所以我无法从Application的资源文件中引用任何字符串值。 (我将字符串存储在自定义XML文件中作为特殊资源)

以下是一切的外观:

ENUM的自定义类:

public class CreepIDs {

    public static Context context = App.getContext();

    public static enum CreepId {

        ROBODEE(0, resourceString(R.creeps.robodee));

        public final int id;
        public final String name;

        CreepId(int id, String name){
            this.id = id;
            this.name = name;
        };
    };

    public static String resourceString(int id){
        return context.getResources().getString(id);
    }
}

APP CLASS EXEXENDING APPLICATION:

public class App  extends Application{

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getContext(){
        return mContext;
    }
}

到目前为止,我已使用调试功能逐步完成了该应用,App.getContext()总是返回 Context ,其值为 { {1}}。我无法弄清楚为什么。 我需要能够从不扩展Android生命周期任何部分的类中引用 null

我会通过构造函数传递上下文,但由于R.creeps.robodeeCreepId static enum实际上并未实例化。我只从主要活动中引用它。

您认为这里最好的解决方案是什么?

4 个答案:

答案 0 :(得分:1)

所以它并不漂亮,但我找到了解决方案。 在onCreate主要活动(此信息现在才被使用的唯一地方)中,我已经输入以下代码:

CreepIDs.context = getApplicationContext();

由于context仍是static public,我会在应用启动时直接为其分配值。我只需要上下文,所以我可以调用资源,但它不会被用于其他任何事情,所以我不认为这对我来说是一个问题。

最后,使用特殊的App课程并不适合我。

感谢大家的帮助。

答案 1 :(得分:0)

试试这个:

public class App extends Application {

    private static App INSTANCE;

    @Override
    public void onCreate() {
        super.onCreate();
        INSTANCE = this;
    }

    public static App getInstance() {
        return INSTANCE;
    }

}

对我有用。

答案 2 :(得分:0)

基于安德烈的回答:

public class App extends Application {

private static App INSTANCE;

@Override
public void onCreate() {
    super.onCreate();
    INSTANCE = this;
}

public static App getInstance() {
    return INSTANCE;
}

}

然后,在CreepsID中:

public class CreepIDs {

public static Context context = App.getInstance();

public static enum CreepId {

    ROBODEE(0, resourceString(R.creeps.robodee));

    public final int id;
    public final String name;

    CreepId(int id, String name){
        this.id = id;
        this.name = name;
    };
};

public static String resourceString(int id){
    return context.getResources().getString(id);
}

}

您正在调用静态方法来获取App的上下文,从而使您的静态类可以访问Activity的资源。

答案 3 :(得分:0)

此链接为我修复了一切: How can I get a resource content from a static context?

我只是意识到我应该创建一个全新的课程,除了Cristians的代码之外什么都没有。记得修改清单!

祝你好运:)