【问题标题】:Android: java.land.NoSuchFieldError after update to SDK 23Android:更新到 SDK 23 后的 java.land.NoSuchFieldError
【发布时间】:2016-09-21 06:02:53
【问题描述】:

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

【问题讨论】:

  • 你为什么还在使用 ABS,你应该已经迁移到实际的支持库操作栏或更好Toolbar 现在
  • 是的,我知道。我的新应用是 API 21 及更高版本,但我仍然支持我的旧应用,不想花时间实现 AppCompat(尝试过一次,变得非常混乱)。
  • 我确实认为 Android 6.0 Preview 和 Android Studio 1.4.1 出现了问题。

标签: android android-support-library android-6.0-marshmallow


【解决方案1】:

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

【讨论】:

  • 也适用于我,即使在使用 com.android.support:support-v4:22.2.0 时出现警告“此支持库不应使用低于 targetSDKVersion (23) 的版本
  • 如果将compileSdkVersion更新到23也可以解决问题。
  • 切换回 com.android.support:support-v4:22.2.0 也对我有用
  • 我有另一个库com.android.support:support-v4:+,导致使用最新版本。将其设置为我在主项目中使用的特定版本为我解决了这个问题。
  • 它对我不起作用。你能告诉我你现在的buildToolsVersion 是什么版本吗?我正在使用HoloEverywhereABS
【解决方案2】:

谢谢@zmarties 的回答,我想添加细节和链接

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

感谢以上回答。

【讨论】:

  • 如何将下载的actionbarsherlock模块与我的Android studio项目集成?
  • 在我的 ActionBarSherlock 版本中,必须在 _ActionBarSherlockTrojanHorse.java 而不是 Watson.java 上进行编辑
【解决方案3】:

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

【讨论】:

  • 我可以通过使用 com.android.support:support-v4:22.2.0 和 Google play services 8.1.0 来实现。
【解决方案4】:

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

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

【讨论】:

  • 很好,请问你有这个补丁发布在任何地方吗?
  • 不 - 我没有充分利用 ActionBarSherlock,我认为这些更改经过充分测试可以作为真正的补丁发布。正如我所说,他们允许编译代码,这足以让我在移植工作中取得进一步进展。
  • >在Watson.java中,将mFragments字段的使用替换为通过>getActiveFragments(null)初始化的局部变量fragments,然后将mFragment引用改成使用局部变量按照这种方式,我可以知道有关如何更改它的示例代码吗?我在 actionbarSherlock 库的 Watson.java 中看不到局部变量片段。而且我也没有看到 getActiveFragment(null) 方法。你能推荐我吗?
  • 现在我找到了方法。我们使用支持库 v4 23 并将新的片段变量添加为 FragmentManagerImpl 片段 = (FragmentManagerImpl) mFragments.getSupportFragmentManager();
  • zmarties 我不明白在 Watson.java 中该怎么做,请你解释一下我应该怎么做才能修复它。我只需要将 support-v4:23+ 与 action bar sherlock 一起使用。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

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

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

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

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

    mFragments.is added != null

    mFragments.getActiveFragments(mCreatedMenus)

    随时随地

    我已经解决了这些问题。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2016-07-27
      • 2014-08-19
      相关资源
      最近更新 更多