【问题标题】:Android access to resources outside of activityAndroid 访问活动之外的资源
【发布时间】:2012-04-09 23:52:55
【问题描述】:

我想知道 - 有没有办法在 Activity 之外访问 android 资源和/或资产文件(或任何其他文件夹中的文件)(不传递上下文)?

没有上下文无法访问:

getResources().getIdentifier("resource_name", "drawable", getPackageName());
getAssets().open("file_in_assets_folder_name");

如果不在 Activity 中则抛出异常:

try {
    Class class = R.drawable.class;
    Field field = class.getField("resource_name");
    Integer i = new Integer(field.getInt(null));
} catch (Exception e) {}

也尝试了以下方法,但它抱怨文件不存在(这里做错了什么?):

URL url = new URL("file:///android_asset/file_name.ext");
InputSource source = new InputSource(url.openStream());
//exception looks like so 04-10 00:40:43.382: W/System.err(5547): java.io.FileNotFoundException: /android_asset/InfoItems.xml (No such file or directory)

【问题讨论】:

  • 我真的无法理解。您想在活动之外访问 android 资源吗?如果不参加活动,你在哪里?安卓资源到底是什么?你的意思是喜欢预装的图标吗?
  • 您是在扩展类中还是在某些您无权访问上下文的库类中?
  • @Marc:你为什么不想传递一个上下文?
  • yoshi - 据我了解,活动是用于用户交互的东西。因此,我的 RSS 和 XML 解析类不是活动。 MisterSquonk - 因为我更喜欢简单地有一个指向 xml 文件位置的常量变量。我可以为远程 xml 文件(rss 提要)执行此操作,为什么不能为我的应用程序中包含的文件执行此操作?

标签: android android-activity android-resources


【解决方案1】:

如果文件夹包含在项目构建路径中,您可以在 android.content.Context 之外使用ClassLoader 访问它们下的文件,例如,从 POJO(如果您不想通过android.content.Context的参考):

String file = "res/raw/test.txt";
InputStream in = this.getClass().getClassLoader().getResourceAsStream(file);
  • 到目前为止,所有 Android SDK 版本都默认将 res 文件夹包含在项目构建路径中。
  • 在 Android SDK r14 之前,assets 文件夹默认包含在项目构建路径中。

要将文件夹添加到项目构建路径中,请右键单击您的项目 -- 构建路径 -- 配置构建路径,将您的文件夹(例如,如果使用更高版本的 SDK 版本的资产)添加为构建路径中的 Source 文件夹。

查看我之前在here回答的类似问题。

【讨论】:

  • 谢谢,这对于访问文件很有效。你能否告诉我是否有办法(没有上下文)访问 R.java 内容? (我上面的问题不清楚,“android 资源”是指 R.java)。
  • “访问 R.java 内容”是什么意思?如果您的意思是导入/使用在 R.java 中生成的公共变量。只需在 POJO 类中导入 com.example.R 即可。请注意,R.java 是从应用程序资源自动生成的,并由 SDK 逐字更改。我不知道你想在这里实现什么,但我认为在 android.content.Context 之外使用 R.java 没有任何意义。
  • 访问是指能够获取有关资源的各种信息。例如,从 name 获取 int id 值(类似于有问题的第一行代码)。如果不需要的话,我只是不想在上下文中传递。
  • 尝试在 POJO 类中添加语句import com.example.R
  • 出于某种原因(可能是因为它是生成的并且有奇特的访问方法)我在脑海中将它视为一些神秘的对象,而不仅仅是一个具有一些公共变量的类......
【解决方案2】:

Android 框架在编译您的应用时创建静态类调用:

your.namespace.project.R

你可以像这样静态调用这个类:

your.namespace.project.R.string.my_prop

this.context.findViewById(your.namespace.project.R.id.my_id_prop);

也许您可以通过这种方式访问​​动态资源:

Resources res = this.context.getResources();
int id = res.getIdentifier("bar"+Integer.toString(i+1), "id", this.context.getPackageName());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多