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 的回答,我想添加详细信息和链接
- 从 gradle
中删除 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
- 从 this link 下载 actionbarsherlock 模块!
- 验证您有 'com.android.support:support-v4:20.0.0' 或 23
- 打开actionbarsherlock模块src将FloatMath改为Math in AnimatorProxy.java
- 打开 actionbarsherlock 模块 src 在 class 级别范围内创建变量片段作为 FragmentManagerImpl fragments = (FragmentManagerImpl) this.getSupportFragmentManager(); in Watson.java
- 将所有出现的 mFragments 替换为片段 变量
感谢您的上述回答。
我更新到 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 的回答,我想添加详细信息和链接
- 从 gradle 中删除 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
- 从 this link 下载 actionbarsherlock 模块!
- 验证您有 'com.android.support:support-v4:20.0.0' 或 23
- 打开actionbarsherlock模块src将FloatMath改为Math in AnimatorProxy.java
- 打开 actionbarsherlock 模块 src 在 class 级别范围内创建变量片段作为 FragmentManagerImpl fragments = (FragmentManagerImpl) this.getSupportFragmentManager(); in Watson.java
- 将所有出现的 mFragments 替换为片段 变量
感谢您的上述回答。