Java 使用Android getIdentifier()

Java 使用Android getIdentifier(),java,android,Java,Android,我试过这个: 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”总是以零结尾 我从一个助手类内部调用这一行,该类不是活动,也不扩展任何内容,因此我

我试过这个:

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”总是以零结尾

我从一个助手类内部调用这一行,该类不是活动,也不扩展任何内容,因此我不能简单地调用
getResources()
,但我可以从
SurfaceView
传递它

最后,我想用一个变量替换
“ball\u red”
,但首先要做的是。这不管用

com.Juggle2
确实是我的包名
drawable
是它所在的
res
文件夹,文件名确实是
ball\u red

R.java说:

        public static final int ball_red=0x7f020027;
所以我不知道为什么它不起作用


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

class Collection extends SurfaceView implements SurfaceHolder.Callback {

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

既然您在活动中,就可以编写它了

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中还检查是否有一个名为“ball\u red”的
drawable

例如:

public static final class drawable {
        public static final int ball_red = 0x7f020000;
 }
编辑 如果您不在任何活动中,则必须传递
上下文而不是资源作为参数
,然后执行此操作

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

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


如果要在xml文件中声明
字符串数组
,则必须通过调用基本资源类型
数组
,使用
字符串数组
来访问该数组,并返回anid 0

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

Xamarin将允许您这样做(即使您不应该这样做),但当应用程序被编译时,名称将被压平为小写,因此您必须参考小写变量,如下所示:

Image Name: iconVaccine.png

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

Correct Reference: iconvaccine

希望有帮助

我不是从活动调用它,我没有访问
getResources()
,但我可以从
SurfaceView
类传递资源,所以我会尝试这样做,
drawable
在那里。@OWiz如果您不在任何活动中,那么您必须传递一个上下文而不是资源作为参数,然后执行以下操作:int resId=context.getResources().getIdentifier(“ball_red”,“drawable”,context.getPackageName());我试过了。上下文显示为空。Investigating@OWiz然后尝试传递getApplicationContext()。如果存在styl null,则您的应用程序存在问题。到目前为止,上下文为空,您无法访问资源。请参阅
resources.getSystem()
:“返回仅提供对系统资源(无应用程序资源)的访问的全局共享资源对象,该对象未针对当前屏幕进行配置(不能使用维度单位,不会根据方向等进行更改)。“正如@Sajmon所回答的那样,您需要将
上下文
实例传递给您的(静态)助手方法以访问特定于应用程序的资源。顺便说一句,类型方面区分大小写,例如“strings”、“drawable”和“strings”或“drawable”