【问题标题】:Resources.NotFoundException only on some devicesResources.NotFoundException 仅在某些设备上
【发布时间】:2017-06-20 03:29:01
【问题描述】:

我正在获取这样的颜色,对于我在崩溃报告中看到的一些设备,它返回 0。他们都在res/values/colors.xml。前任。 <color name="firstcolor">#A8A77A</color>colorString 是动态的。

int primaryColor = ContextCompat.getColor(context,
            context.getResources().getIdentifier(colorString.toLowerCase(),
                    context.getString(R.string.color), context.getPackageName()));

我已经在这些设备上进行了测试,并且可以正常工作: LG G5 (7.0) - 诺基亚 N1 (5.1.1) - 摩托罗拉 G (5.1) - 三星 Core Prime (4.4.4)

崩溃报告来自这些: 三星王牌 4 (4.4.2) - 索尼 Xperia M5 E5603 (6.0) - NG Envy (4.4.2)

Fatal Exception: android.content.res.Resources$NotFoundException: Resource ID #0x0
   at android.content.res.Resources.getValue(Resources.java:1133)
   at android.content.res.Resources.getColor(Resources.java:815)
   at android.support.v4.content.ContextCompat.getColor(ContextCompat.java:434)

有什么方法可以找出为什么它不适用于其中一些设备?

【问题讨论】:

    标签: android android-resources


    【解决方案1】:

    尝试清理项目并查看

    也只是使用

    ContextCompat.getColor(context,R.color.firstcolor)
    

    【讨论】:

    • 不,我需要使用 id 动态获取它们。有很多颜色。
    【解决方案2】:

    你可以这样使用,你应该在getIdentifier中defType为color

    int resourceId = getResources().getIdentifier(colorString.toLowerCase(), "color", context.getPackageName());
    
    int primaryColor = ContextCompat.getColor(resourceId);
    

    【讨论】:

    • 我的R.string.color 是“颜色”。所以这和你的一样。
    【解决方案3】:

    原来问题是toLowerCase()。对于某些语言环境,大写字母 I 被转换为 ı 而不是 i,这导致无法通过标识符找到资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-08
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多