为什么在一些安卓设备上getDrawable()无法工作?

23

我在一些用户的手机上(例如摩托罗拉Razr i)遇到了“nosuchmethod error”的问题,但是在我的HTC上却可以正常工作。以下是代码。

Drawable rBlack;
rBlack = getResources().getDrawable(R.drawable.rblack, getTheme());

并且堆栈跟踪:

java.lang.NoSuchMethodError: android.content.res.Resources.getDrawable
at org.petero.droidfish.myClass.onCreate(myClass.java:434)
at android.app.Activity.performCreate(Activity.java:5248)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:619)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)

如果我使用这个代码:

flipButton.setImageDrawable(getDrawable(R.drawable.rblack));

我遇到了这个错误

java.lang.NoSuchMethodError: org.myclass.getDrawable
at org.myclass.onCreate(myclass.java:435)
at android.app.Activity.performCreate(Activity.java:5248)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269)
at android.app.ActivityThread.access$800(ActivityThread.java:139)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5102)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:619)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)

该复合表达式的哪个部分失败了(提示:将其拆分为多行,然后发布堆栈跟踪)。R.drawable.rblack 究竟在哪里定义?它可能在一个 dpi 特定的文件夹中定义,但在另一个文件夹中没有定义吗? - Chris Stratton
1
请在logcat中发布堆栈跟踪。 - Squonk
2
这没有任何意义 - getDrawable() 应该是 Resources 的一个方法,而不是 org.myclass - Chris Stratton
1
展示给我们 myclass 的源代码。 - Chris Stillwell
@savante - 另一个 Chris 要求您发布 myclass.java 的源代码,由于其中存在严重问题,这是您问题的必要部分。 - Chris Stratton
显示剩余6条评论
3个回答

47

我猜它失败了,是因为getDrawable(R.drawable.rblack, getTheme());在API 21中添加的。请将该行更改为:

```java getDrawable(R.drawable.rblack, null); ```
if(android.os.Build.VERSION.SDK_INT >= 21){
    rBlack = getResources().getDrawable(R.drawable.rblack, getTheme());
} else {
    rBlack = getResources().getDrawable(R.drawable.rblack);
}

@savante:最低SDK版本不重要,只有你所使用的SDK版本才重要。你能否让它正常工作了吗?我现在也面临着同样的问题。 - IcyFlame
@IcyFlame,既然Savante在他/她的评论之后接受了我的答案,那么可以认为他们已经使用了我的解决方案并使其正常工作。如果这里的任何解决方案都不适用于您,我建议您提出一个新问题。您甚至可以链接到本问题中的解决方案,作为您已经尝试过的内容,以免被标记为重复问题。 - Chris Stillwell

29
ContextCompat.getDrawable(Context context, int id)

2
问题是“为什么getDrawable() 在某些Android设备上无法工作?”。 这根本没有回答这个问题。- 来自审核 - Pang
5
我猜他想要一个解决方案而不是崩溃的技术原因。截至目前,这是正确答案。 - ElYeante
我在一些旧设备上也遇到了同样的问题。使用ContextCompat的方法更安全。我真的不知道为什么getDrawable不起作用,它应该可以的! - Roberto

1
尝试添加以下代码行:

context.getResources().getDrawable(R.drawable.your_image_name);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接