【问题标题】:Using Android getIdentifier()使用安卓 getIdentifier()
【发布时间】:2019-12-14 00:38:21
【问题描述】:

我试过了:

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 确实是我的包名。 drawable 是它所在的res 文件夹,而且文件名确实是ball_red

R.java 说:

        public static final int ball_red=0x7f020027;

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


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

class Collection extends SurfaceView implements SurfaceHolder.Callback {

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

【问题讨论】:

  • 根据Resources.getSystem() 的文档:"返回一个全局共享资源对象,该对象仅提供对系统资源(无应用程序资源)的访问权限,并且未配置对于当前屏幕(不能使用尺寸单位,不会根据方向改变等)。” 正如@Sajmon 回答的那样,您需要将Context 实例传递给您的(静态)助手方法来访问特定于应用程序的资源。
  • 顺便说一句,类型方面区分大小写,例如“字符串”、“可绘制”而不是“字符串”或“可绘制”

标签: java android


【解决方案1】:

既然你在一个活动中,写就足够了

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_reddrawable

例如:

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

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

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

【讨论】:

  • 我不是从活动中调用它,也无权访问getResources(),但我可以从SurfaceView 类中传递资源,所以我会尝试
  • 是的,drawable 在那里。
  • @OWiz 如果您没有参与任何活动,那么您必须传递上下文而不是资源作为参数,然后执行此操作 int resId=context.getResources().getIdentifier("ball_red", "drawable" , context.getPackageName());
  • 试过了。上下文出现为空。调查
  • @OWiz 然后尝试传递 getApplicationContext()。如果有 styl null 则说明您的应用程序有问题。到目前为止,上下文为空,您也无法访问资源
【解决方案2】:

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

Xamarin 将允许您这样做(即使您不应该这样做),但是当应用程序被编译时,名称会被压扁为小写,因此您必须按如下方式引用小写变体:

Image Name: iconVaccine.png

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

Correct Reference: iconvaccine

希望有帮助!

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2019-01-22
      • 2014-10-22
      • 2017-03-29
      相关资源
      最近更新 更多