我将Android的目标SDK从22升级到23,但出现了NoSuchMethodError错误。我应该如何修复它?

21

这是我的配置和异常,我不确定该如何修复?

compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
    applicationId "com.rithmio.coach"
    minSdkVersion 19
    targetSdkVersion 23
}

09-17 22:52:15.645  15249-15249/com.rithmio.coach E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.rithmio.coach, PID: 15249
    java.lang.NoSuchMethodError: No virtual method getColor(ILandroid/content/res/Resources$Theme;)I in class Landroid/content/res/Resources; or its super classes (declaration of 'android.content.res.Resources' appears in /system/framework/framework.jar)
            at com.rithmio.coach.mobile.fragment.WorkoutsListFragment.onCreateView(WorkoutsListFragment.java:55)
            at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1016)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1197)
            at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
            at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1562)
            at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330)
            at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:511)
            at com.rithmio.coach.mobile.MobileMainActivity.onStart(MobileMainActivity.java:269)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
            at android.app.Activity.performStart(Activity.java:6006)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

请尝试使用正确的support v4库版本--compile 'com.android.support:support-v4:23.0.0'。 - Nishant Srivastava
2个回答

99

您需要使用ContextCompat.getColor(),它是Support V4库的一部分(因此适用于所有先前的API)。

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

您需要通过将以下内容添加到应用程序 build.gradle 中的 dependencies 数组来添加 Support V4 库:

您需要在应用程序 build.gradle 文件中的 dependencies 数组中添加以下内容以添加 Support V4 库:

(Two possible translations depending on the desired level of simplicity.)
compile 'com.android.support:support-v4:23.0.1'

如果您关心主题设置,文档指定该方法将使用上下文的主题:

从 M 开始,返回的颜色将为指定上下文的主题进行样式设置


这是正确的方法,适用于所有版本的 Build Tools 和 Android。 - Nj Subedi

4

如果你在fragment中使用Resource.getColor(int id)方法,那么它已经被废弃,在文档中已经提到
所以,解决方案是要么采用文档中提到的Resource.getColor(int id, Resource.Theme theme),但这需要通过检查Android版本并使用if条件放置来实现或者
你可以使用这里提到的v4库中的ContextCompat类


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