【问题标题】:Android - getIdentifier always returns 0 (library +application)Android - getIdentifier 始终返回 0(库 + 应用程序)
【发布时间】:2018-10-24 18:50:26
【问题描述】:

我有一个使用 Android 库 (com.appocaliptic.quizknife.core) 的 Android 项目 (com.appocaliptic.quizknife.app)。

我想做的是获取图片的资源ID,即图书馆。图片的路径是:res/drawable-xhdpi/fr_200_133.png

但是,所有尝试都使用 getIdentifier 结果为 0。问题出在哪里?

resId = getResources().getIdentifier("fr_200_133", "drawable", "com.appocaliptic.quizknife.core");
resId = getResources().getIdentifier("com.appocaliptic.quizknife.core:drawable/"+"fr_200_133", null, null);
resId = getResources().getIdentifier("drawable/fr_200_133", null, "com.appocaliptic.quizknife.core");

已编辑:

啊,在R.java中有drawable和corresponding属性。

【问题讨论】:

  • 您正在测试的系统是否有 xhdpi 分辨率的屏幕?
  • @Squonk - 在检索 id 本身时,这无关紧要;仅在检索与 id 关联的可绘制对象时。此外,对于可绘制资源,系统会找到best match,因此即使在 ldpi 设备上也会使用 xhdpi 资源(缩放后)。
  • @TedHopp :是的,同意 - 我忘记了可绘制资源的最佳匹配。

标签: android resources


【解决方案1】:

我遇到了同样的问题:"getIdentifier result 0" 我通过删除图像扩展名(*.jpg、*.jpeg、...等)以匹配名称来解决它在 R.java 文件中

【讨论】:

    【解决方案2】:

    您不应该使用库包名称。试试这个:

    resId = getResources().getIdentifier("fr_200_133", "drawable", getPackageName());
    

    (或getContext().getPackageName(),如果这是在视图中执行)。

    关键是您需要使用应用的包名(如清单中所列)而不是库的包名(实际上在创建应用时会消失)。

    【讨论】:

    • 哇,它工作 O_o。非常感谢-顺便说一句-此信息的任何来源?我发现他们建议的所有资源都使用字符串包名称。谢谢。
    • @bluszcz - 我想我从某个地方的一个例子中学到了这个成语。关键是您需要使用应用程序的包名(如清单中所列)而不是库的包名(实际上在创建应用程序时会消失)。
    • 我相信你应该在回复的同时发表你的评论——这是非常重要的信息;)
    • 这是最佳解决方案的原因是您没有使用硬编码值!
    【解决方案3】:

    我遇到了同样的错误,唯一有效的方法是用不同的方式解决它:

    resourceId = R.drawable.class.getField("fr_200_133").getInt(null);
    

    【讨论】:

    • 这是反射,不推荐。
    • @MalwinderSingh 你能解释一下原因吗?
    【解决方案4】:

    我遇到了类似的问题。我可以像 Hussam Otri 提到的那样解决它。例如:

    //This doesn't work
    context.getResources().getIdentifier("audio_1.mp3", "raw", this.getPackageName()); 
    
    //This works (strip off the file extension)
    context.getResources().getIdentifier("audio_1", "raw", this.getPackageName());
    

    【讨论】:

    • 对我来说,扩展也是原因!谢谢!
    【解决方案5】:

    图片的名称是下划线(下划线)或“_”,结果没问题 因为编译器在编译“imag_0001”后将照片的名称重命名为示例:source:“img0001”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 2016-12-17
      • 2020-07-12
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      相关资源
      最近更新 更多