Android: java.land.NoSuchFieldError 更新到 SDK 23 后

Android: java.land.NoSuchFieldError after update to SDK 23

我更新到 SDK 23,并将 gradle.build 更新为 API 23,将支持库更新为 23.0.0 等,现在尝试 运行 时出现以下错误应用程序(编译得很好)。

java.lang.NoSuchFieldError: No instance field mFragments of type Landroid/support/v4/app/FragmentManagerImpl; in class Landroid/support/v4/app/Watson; or its superclasses (declaration of 'android.support.v4.app.Watson' appears in /data/app/com.my.app-1/base.apk)
            at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:50)
            at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:560)
            at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchCreateOptionsMenu(ActionBarSherlockNative.java:64)
            at com.actionbarsherlock.app.SherlockFragmentActivity.onCreatePanelMenu(SherlockFragmentActivity.java:164)
            at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:548)
            at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:917)
            at com.android.internal.policy.impl.PhoneWindow.run(PhoneWindow.java:258)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            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:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我将所有内容恢复为 API 22,但仍然出现错误。

您是否从设计选项卡更改了主布局中的主题视图? 尝试在设计选项卡中再次将其更改为 Sherlock 主题视图。

我做了一些你做的事情, 但是我发现 gradle 可以解决依赖关系, 在外部库中我找不到 support-v4-23.0.0、support-v7-23.0.0 和其他版本为 23.0.0 的库。 然后我恢复编译'com.android.support:support-v4:22.2.0', 问题解决者@mraviator

我发现如果我进行以下两组更改,我可以使用 SDK 23 构建 ActionBarSherlock:

  • 在 AnimatorProxy.java 中,用相应的 Math 调用替换 FloatMath 调用
  • 在Watson.java中,将mFragments字段的使用替换为通过getActiveFragments(null)初始化的局部变量fragments,然后更改mFragment引用使用局部变量

使用 google 播放服务版本 8.1.0 而不是 8.4.0 在我这边解决了

我在将项目 eclipse 导入到 Android Studio 时遇到了同样的问题

这对我来说是最好的解决方案

我发现如果我进行以下两组更改,我可以使用 SDK 23 构建 ActionBarSherlock:

在 AnimatorProxy.java 中,将 FloatMath 调用替换为其相应的 Math 调用 - 我将 FloatMath - 更改为 Math

在 Waston Class 我遇到了错误 - mFragments.isadded 所以, 我替换了以下代码而不是检查

mFragments.isadded != null

mFragments.getActiveFragments(mCreatedMenus)

需要时无处不在

我已经解决了这些问题。

谢谢@zmarties 的回答,我想添加详细信息和链接

  1. 从 gradle
  2. 中删除 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
  3. this link 下载 actionbarsherlock 模块!
  4. 验证您有 'com.android.support:support-v4:20.0.0' 或 23
  5. 打开actionbarsherlock模块src将FloatMath改为Math in AnimatorProxy.java
  6. 打开 actionbarsherlock 模块 src 在 class 级别范围内创建变量片段作为 FragmentManagerImpl fragments = (FragmentManagerImpl) this.getSupportFragmentManager(); in Watson.java
  7. 将所有出现的 mFragments 替换为片段 变量

感谢您的上述回答。