无法访问 DialogStyle

cannot access DialogStyle

android-support 库更新为 22.2.0 项目后停止编译。

error: cannot access DialogStyle
  class file for android.support.v4.app.DialogFragment$DialogStyle not found
  Consult the following stack trace for details.
  com.sun.tools.javac.code.Symbol$CompletionFailure: class file for android.support.v4.app.DialogFragment$DialogStyle not found

找不到解决此问题的方法。

以前使用的版本是 22.1.1

如果您使用 android.support.v4.app.DialogFragment,就会发生这种情况。 尝试改用 android.app.DialogFragment。

以防万一不要跳过答案:这里也有关于这个问题的讨论https://github.com/excilys/androidannotations/issues/1435

顺便说一句,您是否在存在此问题的项目中使用 Android 注释?

这里有一些对我们有用的解决方法:

解决方法 1(有些人看到了 NPE,有些人没有)

我刚刚找到了一个临时解决方法...直到 appcompat 解决了这个问题:

  1. 在您的项目中创建以下包src/main/java

android.support.v4.app

  1. 创建以下新文件:

DialogFragment$DialogStyle.java

  1. 内容

    包 android.support.v4.app;

    // 在 appcompat 中修复后删除此文件 (https://code.google.com/p/android/issues/detail?id=175086)

public @interface DialogFragment$DialogStyle { }

解决方法 2(有点难看,但不太可能出现构建问题)

我找到了另一个变通办法……有点难看……但我们已经解决了这个问题(包括上述变通办法中的 NPE),直到 appcompat 22.2 得到修复。

  1. 在您的项目中创建以下包src/main/java

android.support.v4.app

  1. 复制 Google v4 FragmentDialog.java 代码

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/app/DialogFragment.java

  1. 重命名 class(类似于 TempFragmentDialog)。如果您不重命名 class.

  2. ,您将收到 "Duplicate" class 错误
  3. 项目中任何具有 @Inject 的 FragmentDialog 都需要扩展 FragmentDialog 的副本(例如:public class MyFragmentDialog extends TempFragmentDialog)

试试这个,它解决了我的问题:

compile ('com.android.support:appcompat-v7:22.2.0') {
        exclude module: 'support-v4' }
compile ('com.android.support:recyclerview-v7:22.2.0') {
        exclude module: 'support-v4' }
compile ('com.android.support:cardview-v7:22.2.0') {
        exclude module: 'support-v4' }
compile ('com.android.support:design:22.2.0') {
        exclude module: 'support-v4' }
// and exclude support-v4 from other dependencies as well that might include it
// finally add it, but avoid version 22.2.0...
compile ('com.android.support:support-v4:22.1.1')

无需手动将 support-v4 库添加到您的 libs 目录,最后一次导入可确保您的项目中包含正确的版本。

顺便说一句,所有这些解决方法都不是你的错,怪别人:)

我正在使用此处找到的解决方法 https://code.google.com/p/android/issues/detail?id=175086#c9

我修改了 build.gradle 文件,在依赖项部分添加了以下内容:

compile fileTree(include: ['*.jar'], dir: 'libs')
compile ('com.android.support:appcompat-v7:22.2.0') {
    exclude module: 'support-v4'
}
compile ('com.android.support:gridlayout-v7:22.2.0') {
    exclude module: 'support-v4'
}
compile ('com.android.support:cardview-v7:22.2.0') {
    exclude module: 'support-v4'
}
compile ('com.android.support:design:22.2.0') {
    exclude module: 'support-v4'
}

您还必须将它从任何其他使用支持库(如 dagger 或 facebook)的依赖项中排除。

然后,我将 $ANDROID_HOME/extras/android/support/v4 中的 android-support-v4.jar 文件添加到我的 libs 目录中,因为该文件似乎有 DialogFragment$DialogStyle。

现在,我的构建又完全正常了,但我仍然希望这个问题能尽快得到修复。

@takoli 的回答在大多数情况下都有效,但如果您有其他依赖项默默地包含 support-v4,或者如果您懒得在任何地方显式排除 support-v4,这里是另一种解决方案。

compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:recyclerview-v7:22.2.0'
compile 'com.android.support:mediarouter-v7:22.2.0'
// Force stable version of support-v4
compile ('com.android.support:support-v4:22.1.1') {
    force = true
}

更新:

AndroidAnnotations 发布了解决此问题的新版本 3.3.2。如果您正在使用 AndroidAnnotations 更新到 3.3.2 并使用 22.2.0 支持库而不强制使用旧版本的 support-v4。有关详细信息,请参阅 this thread

简而言之,这是支持库版本 22.2.0 中的一个错误

刚刚升级到下一个更新 22.2.1,效果很好。