63

我试过这个:

r = Resources.getSystem().getIdentifier("ball_red","drawable","com.Juggle2");
Log.i("FindBall","R = "+r);

还有这个:

r = Resources.getSystem().getIdentifier("com.Juggle2:drawable/ball_red", null, null);

但 'r' 总是以零结束。

我从一个不是 Activity 并且不扩展任何东西的辅助类内部调用这一行,所以我不能简单地调用getResources(),但我可以从我的SurfaceView.

最终,我想"ball_red"用一个变量替换,但首先是第一件事。这是行不通的。

com.Juggle2确实是我的包名。drawableres它所在的文件夹,并且文件名确实是ball_red.

R.java 说:

        public static final int ball_red=0x7f020027;

所以我不确定为什么它不起作用。


所以我不能使用资源,我必须传递一个上下文,我这样做是这样的:在里面:

class Collection extends SurfaceView implements SurfaceHolder.Callback {

我正在为我的类创建一个新实例并将其getContext()作为参数传递。

4

3 回答 3

144

由于您在活动中,因此编写就足够了

int resId = YourActivity.this.getResources().getIdentifier(
    "ball_red",
    "drawable",
    YourActivity.this.getPackageName()
);

或者如果你不是从内部类调用它

int resourceID = getResources().getIdentifier(
    "ball_red",
    "drawable",
    getPackageName()
);

笔记

getIdentifier() Returns 0 if no such resource was found. (0 is not a valid resource ID.)

查看

还要检查你的 R.java 是否有一个drawable名字ball_red

例如:

public static final class drawable {
        public static final int ball_red = 0x7f020000;
 }

编辑 如果您没有参加任何活动,那么您必须通过 acontext instead of resources as parameter然后执行此操作

int resId = context.getResources().getIdentifier(
    "ball_red",
    "drawable",
    context.getPackageName()
);
于 2013-03-18T22:39:13.440 回答
6

对于 Xamarin 用户,我遇到了一个问题,即我添加了一个带有大小写字母的图标(例如 iconVaccine.png )并且指的是大写名称 iconVaccine。

Xamarin 将允许您执行此操作(即使您不应该这样做),但是当应用程序被编译时,名称将被展平为小写,因此您必须引用小写变体,如下所示:

Image Name: iconVaccine.png

Xamarin reference: iconVaccine (as created in Resource.designer.cs, but will fail)

Correct Reference: iconvaccine

希望有帮助!

于 2016-02-26T10:17:10.920 回答
4

虽然 Festus Tamakloe 的回答是正确的,但我发现这个函数有一个怪癖。

如果您string-array在 xml 文件中声明 a ,则必须通过调用基本资源类型来访问它array,使用string-array结果为 anid 0 返回。

于 2015-05-31T18:01:12.910 回答