2012-04-09 36 views
3

我想知道吗?是否有方法可以在活动(而不通过上下文)之外访问android资源和/或资产文件(或来自任何其他文件夹的文件)?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) 
+0

我真的不能理解。你想访问活动之外的Android资源?如果不在活动中,你在哪里? Android资源究竟是什么?你的意思是像预先安装的图标? – yoshi 2012-04-09 23:56:35

+0

你是在扩展类还是在某些你无权访问上下文的库类中? – 2012-04-10 00:23:55

+0

@Marc:你为什么不想传递一个Context? – Squonk 2012-04-10 00:24:27

回答

5

如果文件夹包含在项目构建路径中,则可以使用在android.content.Context外面下起他们个访问文件,例如,从一个POJO(在情况下,如果你不希望传递android.content.Context的参考):

String file = "res/raw/test.txt"; 
InputStream in = this.getClass().getClassLoader().getResourceAsStream(file); 
  • 的res文件夹默认由所有Android SDK版本包含在Project Build Path中。
  • 在Android SDK r14之前,assets文件夹默认包含在Project Build Path中。

添加文件夹到项目构建路径,右键点击你的项目 - 构建路径 - 配置构建路径,添加文件夹(例如,如果资产使用后的SDK版本)作为构建路径源文件夹。

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

+0

谢谢,这适用于访问文件。 你能不能告诉我,如果有一种方法(没有上下文)访问R.java内容? (我的上面的问题不明确,我的意思是R.java的“android资源”)。 – Marc 2012-04-10 21:37:12

+0

“访问R.java内容”是什么意思?如果你的意思是在R.java中生成的导入/使用公共变量。只需在您的POJO课程中导入com.example.R即可。请注意,R.java是从应用程序资源中自动生成的,并通过SDK进行有识字的更改。我不知道你想在这里实现什么,但是我没有看到在android.content.Context之外使用R.java。 – yorkw 2012-04-10 21:52:23

+0

通过访问我的意思是能够获得有关资源的各种信息。例如,从名称中获取int id值(与第一行代码类似)。如果我不需要,我只是不想通过。 – Marc 2012-04-10 22:25:27

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