【问题标题】:setBackgroundResource from numeric string causes Fatal Error - Android/Java来自数字字符串的 setBackgroundResource 导致致命错误 - Android/Java
【发布时间】:2023-12-07 17:00:01
【问题描述】:

我正在尝试从数字文件名(它必须是数字 - 这不能更改)字符串(图像是 1170.png)设置布局的背景。

我尝试使用以下示例:

Android drawables : Is there any way to somehow link the int IDs to the R drawable IDs?

但是,当我这样做时,结果如下:

06-03 08:36:47.551: E/AndroidRuntime(1765): FATAL EXCEPTION: main
06-03 08:36:47.551: E/AndroidRuntime(1765): Process: com.app.example, PID: 1765
06-03 08:36:47.551: E/AndroidRuntime(1765): android.content.res.Resources$NotFoundException: Resource ID #0x8c5
06-03 08:36:47.551: E/AndroidRuntime(1765):     at android.content.res.Resources.getValue(Resources.java:1123)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at android.content.res.Resources.getDrawable(Resources.java:698)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at android.view.View.setBackgroundResource(View.java:15303)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at com.app.example.MainActivity$1.handleMessage(MainActivity.java:163)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at com.app.example.ServiceManager$IncomingHandler.handleMessage(ServiceManager.java:28)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at android.os.Handler.dispatchMessage(Handler.java:102)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at android.os.Looper.loop(Looper.java:136)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at android.app.ActivityThread.main(ActivityThread.java:5001)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at java.lang.reflect.Method.invokeNative(Native Method)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at java.lang.reflect.Method.invoke(Method.java:515)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-03 08:36:47.551: E/AndroidRuntime(1765):     at dalvik.system.NativeStart.main(Native Method)

我的代码 sn-p 如下 - 看起来是正确的 - 但它似乎有问题(显然)。谁能发现我在这种情况下可能做错了什么?

String SnapShotFrame_TblTriviaLU = "1170";
RelativeLayout relativeLayout2 = (RelativeLayout) findViewById(R.id.gameplayLayout);
            int resId = getResources().getIdentifier(SnapShotFrame_TblTriviaLU, "drawable", getPackageName());
                                relativeLayout2.setBackgroundResource(resId);

【问题讨论】:

  • 把你的图片放到Asset中然后从asset使用?

标签: java android android-drawable fatal-error


【解决方案1】:

很遗憾,您不能拥有具有数字名称的资源。也许您可以做一个解决方法:更改为 drawable_1170,如果您需要比较或使用该数字,您可以删除字符串“drawable_”。

String SnapShotFrame_TblTriviaLU = "1170";
RelativeLayout relativeLayout2 = (RelativeLayout) findViewById(R.id.gameplayLayout);
            int resId = getResources().getIdentifier("drawable_"+SnapShotFrame_TblTriviaLU, "drawable", getPackageName());
                                relativeLayout2.setBackgroundResource(resId);

【讨论】:

  • 这很有帮助 - 谢谢!! (我能够启动并运行它 - 在你自己和另一个答案之间 - 现在我知道它为什么不起作用 - 谢谢你们!)
【解决方案2】:

我假设您尝试使用 R.drawable.1170 没有成功,然后尝试了您发布的解决方案。

资源标识符必须以字符开头。那是因为 Java 标识符必须以字符开头。

在此处阅读更多信息Why can an identifier not start with a number?

【讨论】: