Android:升级到SDK 23后出现java.land.NoSuchFieldError错误

27

我更新了 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$1.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,但仍然出现错误。


2
为什么你还在使用 ABS,你应该已经迁移到实际的支持库 ActionBar,甚至更好的是 Toolbar - tyczj
是的,我知道。我的新应用程序是API 21及以上版本,但我仍然支持我的旧应用程序,并且不想花时间实现AppCompat(尝试过一次,变得非常混乱)。 - mraviator
我相信在Android 6.0预览版和Android Studio 1.4.1中出现了一些问题。 - SilentKnight
6个回答

14

我和你做了一样的事情, 但是我发现Gradle可以解决依赖问题, 在“External Libraries”中,我找不到support-v4-23.0.0、support-v7-23.0.0以及其他版本为23.0.0的库。 然后我回退到compile 'com.android.support:support-v4:22.2.0', 这个问题的解决者是@mraviator。


3
即使使用com.android.support:support-v4:22.2.0时会出现警告"This support library should not use a lower version than the targetSDKVersion (23)",但对我也是有效的。 - Oded Regev
1
如果将 compileSdkVersion 更新为 23,问题也可以得到解决。 - sanemars
2
切换回 com.android.support:support-v4:22.2.0 对我也起作用了。 - Pablo A. Martínez
我有另一个库使用了com.android.support:support-v4:+,这导致最新版本被使用。将其设置为我在主项目中使用的特定版本,解决了我的问题。 - Eben Geer
它对我不起作用。你能告诉我你现在的buildToolsVersion版本是什么吗?我正在使用HoloEverywhereABS - Wooseong Kim
显示剩余2条评论

12

感谢 @zmarties 的答案,我想补充一些详细信息和链接。

  1. 从Gradle中删除'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
  2. 此链接下载actionbarsherlock模块!
  3. 检查您是否拥有'com.android.support:support-v4:20.0.0'或23
  4. 在AnimatorProxy.java中的actionbarsherlock模块src中将FloatMath更改为Math
  5. 在Watson.java中的actionbarsherlock模块src中在类级别作用域下创建变量fragments,如FragmentManagerImpl fragments = (FragmentManagerImpl) this.getSupportFragmentManager();
  6. 用fragments变量替换所有mFragments出现

感谢以上答案。


如何将download actionbarsherlock模块集成到我的Android Studio项目中? - user2872856
1
在我的ActionBarSherlock版本中,必须在_ActionBarSherlockTrojanHorse.java上进行编辑,而不是Watson.java。 - FrizzTheSnail

6

使用 Google Play 服务版本 8.1.0 取代 8.4.0,解决了我的问题。


我可以通过使用com.android.support:support-v4:22.2.0和Google Play服务8.1.0来实现它。 - Antonio Carlos

3
我发现如果做出以下两个更改,我可以使用SDK 23构建ActionBarSherlock:
  • 在AnimatorProxy.java中,将FloatMath调用替换为其对应的Math调用
  • 在Watson.java中,用通过getActiveFragments(null)初始化的局部变量fragments替换mFragments字段的使用,然后更改mFragment引用以使用局部变量

很好,你把这些补丁发布到哪里了吗? - Marek Sebera
不,我没有充分利用ActionBarSherlock来考虑这些更改是否足够测试以发布为真正的补丁。正如我所说,它们使代码能够编译,这足以让我在移植工作中取得进一步的进展。 - zmarties
在Watson.java中,用通过getActiveFragments(null)初始化的本地变量fragments替换mFragments字段的使用,然后将mFragment引用更改为使用本地变量。根据这种方式,我可以知道如何更改它的示例代码。我在actionbarSherlock库中的Watson.java中没有看到本地变量fragments,也没有看到getActiveFragment(null)方法。您能否给我建议? - Kyaw Min Thu L
1
现在我找到了方法。我们使用支持库v4 23,并添加新的片段变量作为FragmentManagerImpl fragments =(FragmentManagerImpl)mFragments.getSupportFragmentManager(); - Kyaw Min Thu L
zmarties,我不明白在Watson.java中该怎么做,请问你能解释一下我应该怎么做来修复它吗?我只需要使用support-v4:23+和action bar sherlock。 - AMarones

0
你在主布局的设计选项卡中更改了主题视图吗? 尝试再次在设计选项卡中将其更改为Sherlock主题视图。

0

当我将Eclipse项目导入到Android Studio时,遇到了同样的问题。

这是对我最好的解决方案。

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

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

在Waston类中,我遇到了错误 - mFragments.isadded 所以, 我用以下代码替换检查:

mFragments.isadded != null

变成

mFragments.getActiveFragments(mCreatedMenus)

无论何时需要,

我已经解决了这些问题。


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