【问题标题】:Getting resources from non-activity classes从非活动类中获取资源
【发布时间】:2014-07-15 14:19:46
【问题描述】:

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

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

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

一切都是这样的:

枚举的自定义类:

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 类扩展应用:

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 值为 null。我不知道为什么。 我需要能够从一个不扩展 android 生命周期任何部分的类中引用R.creeps.robodee

我会通过构造函数传递上下文,但由于 CreepIdstatic enum CreepIDs 实际上并没有被实例化。我只从主要活动中引用它。

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

【问题讨论】:

  • 我认为 getApplicationContext 返回 null 因为它是在 onCreate 方法中调用的,该上下文尚未实例化。
  • 您能否举例说明如何在应用程序中使用 Enum?

标签: java android enums resources android-context


【解决方案1】:

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

CreepIDs.context = getApplicationContext();

因为无论如何contextstatic public,我在应用程序启动时直接为其分配一个值。我只需要上下文,所以我可以调用资源,它不会用于其他任何事情,所以我认为这对我来说根本不是问题。

最后,使用特殊的 App 类对我不起作用。

感谢大家的帮助。

【讨论】:

    【解决方案2】:

    试试这个:

    public class App extends Application {
    
        private static App INSTANCE;
    
        @Override
        public void onCreate() {
            super.onCreate();
            INSTANCE = this;
        }
    
        public static App getInstance() {
            return INSTANCE;
        }
    
    }
    

    它对我很有用。

    【讨论】:

    • 对不起。这并没有解决它。我怀疑问题在于我无法从 App 中提取应用程序上下文,因为 App 永远不会从属于 Android 生命周期一部分的类中引用。
    【解决方案3】:

    根据安德烈的回答:

    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 的资源。

    【讨论】:

    • 正如我刚才向安德烈解释的那样,这不起作用。是的,我确实确保将调用的方法更改为App.getInstance()。这并没有解决问题。一切都保持不变。从理论上讲,这就是我想要的,我相信我目前的解决方案可以做同样的事情。问题是,我不相信public static Context context = App.getContext(); 甚至不会被调用,因为CreepIDs 从未实际实例化过。但是,调用App.getContext().getResources() 仍然返回null(即使我将内容更改为上面建议的格式)
    • 好吧,你为什么要实例化 CreepID?如果您不是(并且您没有构造函数),请将其设为静态类。
    • 我没有实例化CreepIDs。我已经将它用作静态类。那就是问题所在。无论如何,我找到了一个迂回的解决方案。但是感谢您的尝试。
    • 很高兴您找到了解决方案,但在您发布的示例代码中,它不是 static
    【解决方案4】:

    此链接为我解决了所有问题: How can I get a resource content from a static context?

    我只需要意识到我应该创建一个全新的类,除了 Cristians answer 中的代码之外什么都没有。记得修改Manifest!

    祝你好运:)

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2011-11-25
      • 1970-01-01
      相关资源
      最近更新 更多