【问题标题】:Accessing Resources without a Context在没有上下文的情况下访问资源
【发布时间】:2011-07-31 06:39:48
【问题描述】:

我正在尝试将配置(例如 URL/等)放入资源文件夹以供实用程序类使用。但是,我不想从各处的活动中传递上下文。我希望能够通过路径名访问资源(似乎 assets/ 是为此用途而设计的),而无需使用上下文来访问资源。

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

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

【问题讨论】:

标签: java android android-resources android-context


【解决方案1】:

使用

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

您可以在应用程序的任何地方使用它,甚至在静态常量声明中!但仅适用于系统资源

对于本地资源,请使用that solution

【讨论】:

  • 但仅适用于系统资源。
  • @Youngjae 是的。对于本地人,请遵循参考。
  • 出现异常:android.content.res.Resources$NotFoundException: String resource ID
  • 这个答案有误导性,问题是指本地资源
  • @Abhijit 有两个答案。如果您不喜欢第一个,请按照第二个的参考。所以,这不是误导,相反,它会引导你找到正确的解决方案。
【解决方案2】:

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

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"
 ... >

【讨论】:

  • 使用这个有什么潜在的缺点吗?
  • 试图这样做但不幸的是关于清单,我不知道“...”应该是什么,或者这个代码块是否应该替换、合并或添加到现有的应用程序代码块。
  • 在清单中的
【解决方案3】:

我建议您执行以下操作: 与其到处传递上下文,不如让你的活动类成为一个带有返回上下文的公共函数的单例类:

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

【讨论】:

  • 非常糟糕的解决方案。您正在以这种方式泄露您的活动。
  • 不,他正在使用应用程序上下文,因此活动不会泄露。
  • 我刚用过这个,效果很好!但是为什么这与传递上下文不一样呢?我对 android 很陌生。
【解决方案4】:

不幸的是,我认为没有真正的解决方法。我布置了类似这样的东西,并且还传递了 getApplicationContext() 而不是活动上下文。

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

    return self;
}

然后:

appController = AppController.getAppController(getApplicationContext());

【讨论】:

  • 哦,好吧,我担心这会是答案。只能从上下文访问应用程序资源似乎是非常糟糕的设计。我敢肯定这是有原因的……但这仍然很烦人。感谢您的确认 =)
  • 我和我的团队一直在抱怨。这使得编写解耦的模块化代码变得很困难。
【解决方案5】:

stackoverflow 对以下问题的回答显示了如何使用 POJO 获取到资源的流(如果您提供其路径)。如果您需要从众多资源中选择一个特定资源,这可能会很有用。

Is it possible to read a raw text file without Context reference in an Android library project

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2023-03-13
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多