首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在没有上下文的情况下访问资源

在没有上下文的情况下访问资源
EN

Stack Overflow用户
提问于 2011-04-07 08:29:00
回答 4查看 41.3K关注 0票数 33

我正在尝试将URL/etc等配置放入一个资源文件夹中,以供实用程序类使用。然而,我不想到处传递来自活动的上下文。我希望能够通过路径名访问资源(看起来像资产/是为此用途而设计的),而无需使用上下文来访问资源。

在本例中,我希望单例在实例化时使用配置中的内容。除了实例化期间的这一次之外,它不需要任何来自资源的东西。因此,每次调用getInstance()时都必须在上下文中传递,这完全是一种浪费。

此外,这是特定于应用程序的配置,不应该存储在共享系统文件或类似的东西中。

EN

回答 4

Stack Overflow用户

发布于 2012-11-07 03:58:49

您可以扩展主应用程序类并在其中提供访问资源的通用帮助器。这减轻了对上下文的需求,因为应用程序将提供上下文,而不是调用者。应用程序类是单例样式的,应该在应用程序的任何部分(包括服务)运行时始终可用。

代码语言:javascript
复制
public class MyApplication extends Application {
 protected static MyApplication instance;

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

 public static Resources getResources() {
  return instance.getResources();
 }
}

这使您可以访问以下内容:

代码语言:javascript
复制
MyApplication.getResources()....

请确保在清单中声明您的自定义应用程序才能访问此应用程序。假设您的自定义应用程序位于应用程序的名称空间的根目录中:

代码语言:javascript
复制
<application
 android:name=".MyApplication"
 ... >
票数 15
EN

Stack Overflow用户

发布于 2012-08-18 01:12:13

我建议这样做:不是到处传递上下文,而是让你的activity类成为一个带有返回上下文的公共函数的单例类:

代码语言:javascript
复制
private static ActivityMain instance;

在super.onCreate()之前在onCreate()内部初始化:

代码语言:javascript
复制
instance = this;

然后将这些公共函数添加到您的活动中:

代码语言:javascript
复制
/** Get singleton instance of activity **/
public static ActivityMain getInstance() {
    return instance;
}

/** Returns context of this activity **/
public static Context getContext(){
    return instance.getApplicationContext();
}

现在,您可以在任何类中的任何位置使用以下内容:

代码语言:javascript
复制
Context context = AntiMorphActivity.getContext();
String packageName = context.getPackageName();
int id = context.getResources().getIdentifier("web_page", "raw", packageName);
票数 2
EN

Stack Overflow用户

发布于 2011-04-07 08:40:56

不幸的是,我不认为有一个真正的方法来解决这个问题。我列出了类似这样的内容,并且还传入了getApplicationContext()而不是activity上下文。

代码语言:javascript
复制
public static AppController getAppController(Context context){
    if(self == null) {
        //Create instance
        self = new AppController();
    }

    return self;
}

然后:

代码语言:javascript
复制
appController = AppController.getAppController(getApplicationContext());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5574506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档