2011-04-07 68 views
17

我试图把URLs/etc等配置放入工具类的资源文件夹中使用。但是,我不想从各地的活动中传递语境。我希望能够通过路径名称访问资源(看起来像assets /专为此目的而设计),而不使用上下文来访问资源。访问没有上下文的资源

在这种特殊情况下,我想要一个单例在实例化时在配置中使用某些东西。在实例化过程中除了那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递一个Context,这完全是浪费。

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

回答

61

使用

Resources.getSystem().getString(android.R.string.someuniversalstuff) 

你可以在你的应用程序ABSOLUTELY任何地方使用它,即使是在静态常量声明!但仅限于系统资源。

对于本地资源使用that solution

+21

**但仅限系统资源。** – Youngjae 2015-11-18 14:40:13

+0

@Youngjae yes。对于本地人来说,请参考参考资料。 – Gangnus 2015-11-19 00:07:25

+0

我得到一个异常:android.content.res.Resources $ NotFoundException:字符串资源ID – vinidog 2016-05-29 18:50:33

1

不幸的是,我不认为有一个真正的解决方法。我把这样的东西放在这里,并且传入getApplicationContext()而不是活动上下文。

public static AppController getAppController(Context context){ 
    if(self == null) { 
     //Create instance 
     self = new AppController(); 
    } 

    return self; 
} 

然后:

appController = AppController.getAppController(getApplicationContext()); 
+0

喔好,我很害怕,将是答案。这似乎是非常糟糕的设计,只能从上下文访问应用程序资源。我相信这是有原因的......但这很恼人。感谢您的确认=) – mnemy 2011-04-07 00:50:49

+0

我和我的团队一直抱怨。这使得编写非耦合模块化代码变得很困难。 – sgarman 2011-04-07 01:18:27

1

我建议做以下几点: 而不是传递方面处处让您的活动类单例类与返回上下文公共职能:

private static ActivityMain instance; 

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

instance = this; 

这些公共职能然后添加到您的活动:

/** Get singleton instance of activity **/ 
public static ActivityMain getInstance() { 
    return instance; 
} 

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

现在你可以使用任何种类的任何位置以下:

Context context = AntiMorphActivity.getContext(); 
String packageName = context.getPackageName(); 
int id = context.getResources().getIdentifier("web_page", "raw", packageName); 
+0

非常可怕的解决方案。你正在以这种方式泄露你的活动。 – 2012-12-12 14:09:07

+2

不,他正在使用应用程序上下文,因此活动不会泄露。 – Davor 2013-01-13 12:09:40

9

你可以扩展主应用程序类,并提供通用的助手那里访问资源。这减轻了对上下文的需求,因为应用程序将提供上下文而不是调用者。应用程序类是单例风格的,并且应用程序的任何部分都在运行时(包括服务)应始终可用。

public class MyApplication extends Application { 
protected static MyApplication instance; 

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

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

这将使您能够访问:

MyApplication.getResources().... 

一定要在你的清单申报您的自定义应用程序来访问此。假设您的自定义应用程序是在应用程序的命名空间的根:

<application 
android:name=".MyApplication" 
... > 
+0

使用这个有什么潜在的缺点吗? – 2017-11-12 00:35:59