4

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

没有上下文无法访问:

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

如果不在活动中,则抛出异常:

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

2 回答 2

5

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

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

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

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

于 2012-04-10T00:25:38.737 回答
1

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());
于 2013-09-03T18:41:42.063 回答