【问题标题】:Injected views are null with RG 3.0RG 3.0 的注入视图为空
【发布时间】:2014-10-24 20:43:56
【问题描述】:

我直接在 Android Studio 中使用 RoboGuice 3.0,因为我需要对 ActionBarActivity 的支持。这是我的部门:

compile 'org.roboguice:roboguice:3.0'

我必须做的第一件奇怪的事情是解决“无法使用注释数据库”的 ClassNotFoundException。似乎如果没有给出注释包,则 packageList 是 prepended with empty string 并且 DI 框架抱怨它无法在根包中找到 AnnotationDatabaseImpl(这是预期的)。所以我在清单中这样做了:

<meta-data android:name="roboguice.annotations.packages" android:value="roboguice"/>

解决了这个问题。然后,我将代码更改为:

@ContentView(R.layout.activity_playlists)
public class Playlists extends RoboActionBarActivity {
  @InjectView(R.id.toolbar)
  Toolbar toolbar;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setSupportActionBar(toolbar);
  }
}

setSupportActionBar() 抛出 NPE。我通过调试器和 注入视图时,viewMembersInjectors 映射为空。我在想我必须做的奇怪的修复,这是相关的。不知何故,没有发现 injectview 成员。但是我的@ContentView 注入有效(如果我删除它,则永远不会调用内容更改回调)。

有谁知道如何解决这个问题?

【问题讨论】:

    标签: android roboguice


    【解决方案1】:

    一种解决方案是使用扩展 Application.class 的自定义类,您可以禁用注释数据库的使用。

    public class CustomApplication extends Application {
        public void onCreate() {
            super.onCreate();
            RoboGuice.setUseAnnotationDatabases(false);
        }
    }
    

    另一种方法是创建一个名为 roboguice.useAnnotationDatabases 的环境变量,并将其值设置为 false,因为 RG3 似乎会检查该值。

    这将允许您像以前一样使用 RoboGuice,尽管它会失去使用注释数据库的所有性能提升。


    更新

    生成注释数据库还应该修复您的 NPE,并且还会为您的应用程序增加一些性能提升。首先,您必须在 build.gradle 中包含以下依赖项。

    depencencies {
    ...
        provided 'org.roboguice:roboblender:3.0'
    }
    

    您还应该添加以下内容:

    allprojects {
        gradle.projectsEvaluated {
            tasks.withType(JavaCompile) {
                options.compilerArgs << "-AguiceAnnotationDatabasePackageName=databasename"
            }
        }
    }
    

    要让您的数据库正常工作,您应该在 AndroidManifest.xml 的元数据值中添加 databasename。

     <meta-data android:name="roboguice.annotations.packages" android:value="roboguice,databasename"/>
    

    【讨论】:

    • 请原谅我对这个主题的了解。你能详细说明答案吗?我们需要添加两个修复程序还是其中一个都可以? @Kelsos
    • 任何一个都可以,第一个将完全关闭注释数据库的使用并与反射一起工作,第二个将创建注释数据库并提供性能提升。
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2020-11-23
    • 2015-11-18
    • 2010-11-17
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多