使用RG 3.0注入的视图为null

时间:2014-10-24 20:43:56

标签: android roboguice

我在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注入工作(如果我删除了内容,则永远不会调用更改的回调)。

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

1 个答案:

答案 0 :(得分:4)

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

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

另一种方法是创建一个名为roboguice.useAnnotationDatabases的Enviroment变量,其值设置为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"/>