2014-10-10 40 views
4

嗨,我是新来的匕首,并试图用简单的Android应用程序来研究它。没有注册注册。你必须明确地将它添加到你的模块中的'注入'选项

即使存在注入此视图的模块,我也会从标题中看到错误。任何人都可以帮我弄清楚为什么它没有注入视图?

这里是我的应用程序主要模块:

@dagger.Module(injects = {App.class, MainActivity.class}, complete = false) 
public class AppModule { 
    private final App app; 
    public AppModule(App app) { this.app = app; } 
    @Provides @Singleton public App provideApp() { return app; } 
} 

是注入我的观点的另一个模块:

@Layout(R.layout.sidemenu) 
public class SidemenuScreen implements Blueprint{ 
    @Override public String getMortarScopeName() { return getClass().getName(); } 
    @Override public Object getDaggerModule() { return new Module();} 

    @dagger.Module(injects= SidemenuView.class, addsTo = AppModule.class) 
    public static class Module { 
     public Module() {} 
    } 

    @Singleton public static class Presenter extends ViewPresenter<SidemenuView> { 
     @Inject Presenter() {} 
     @Override protected void onLoad(Bundle savedInstanceState) {super.onLoad(savedInstanceState); } 
     @Override protected void onSave(Bundle outState) { super.onSave(outState); } 
    } 
} 

正如你可以看到SidemenuScreen.Module注入SidemenuView和addsTo AppModule。我错了吗 ?应注射

public class SidemenuView extends LinearLayout { 
    @Inject SidemenuScreen.Presenter presenter; 

    public SidemenuView(Context context) {this(context, null); } 
    public SidemenuView(Context context, AttributeSet attrs) { this(context, attrs, 0); } 
    public SidemenuView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     Mortar.inject(context, this); 
    } 
} 

和活动

ObjectGraph objectGraph = ObjectGraph.create(new AppModule(this)); 
    objectGraph.inject(this); 
    rootScope = Mortar.createRootScope(BuildConfig.DEBUG, objectGraph); 

认为使用这些东西:

public class MainActivity extends Activity { 
    private MortarActivityScope activityScope; 
    @Inject App app; 

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

     setContentView(R.layout.activity_main); 

     Blueprint screen = getScreenFromIntent(getIntent()); 

     if (screen != null) { 
      MortarScope parentScope = Mortar.getScope(getApplication()); 
      activityScope = Mortar.requireActivityScope(parentScope, screen); 
      activityScope.onCreate(savedInstanceState); 

      Mortar.inject(this, this); 
     } 

     SlidingMenu menu = new SlidingMenu(this); 
     menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW); 
     menu.setMenu(R.layout.sidemenu); 
    } 
} 

ObjectGraph在我的应用程序类的onCreate()方法,这样产生

这里使用this滑动菜单库:

因此,当menu.setMenu(R.layout.sidemenu);称它膨胀视图和Mortar.inject(context, this);SidemenuView构造函数调用发生错误。

这里是堆栈中:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dagger/com.example.dagger.ui.MainActivity}: android.view.InflateException: Binary XML file line #3: Error inflating class com.example.dagger.ui.sidemenu.SidemenuView 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
      at android.app.ActivityThread.access$900(ActivityThread.java:161) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:157) 
      at android.app.ActivityThread.main(ActivityThread.java:5356) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: android.view.InflateException: Binary XML file line #3: Error inflating class com.example.dagger.ui.sidemenu.SidemenuView 
      at android.view.LayoutInflater.createView(LayoutInflater.java:626) 
      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:470) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
      at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
      at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.setMenu(SlidingMenu.java:375) 
      at com.example.dagger.ui.MainActivity.setupSidemenu(MainActivity.java:93) 
      at com.example.dagger.ui.MainActivity.onCreate(MainActivity.java:51) 
      at android.app.Activity.performCreate(Activity.java:5426) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
            at android.app.ActivityThread.access$900(ActivityThread.java:161) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:157) 
            at android.app.ActivityThread.main(ActivityThread.java:5356) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.reflect.InvocationTargetException 
      at java.lang.reflect.Constructor.constructNative(Native Method) 
      at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
      at android.view.LayoutInflater.createView(LayoutInflater.java:600) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:470) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
            at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.setMenu(SlidingMenu.java:375) 
            at com.example.dagger.ui.MainActivity.setupSidemenu(MainActivity.java:93) 
            at com.example.dagger.ui.MainActivity.onCreate(MainActivity.java:51) 
            at android.app.Activity.performCreate(Activity.java:5426) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
            at android.app.ActivityThread.access$900(ActivityThread.java:161) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:157) 
            at android.app.ActivityThread.main(ActivityThread.java:5356) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.example.dagger.ui.sidemenu.SidemenuView. You must explicitly add it to the 'injects' option in one of your modules. 
      at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:302) 
      at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:279) 
      at mortar.Mortar.inject(Mortar.java:93) 
      at com.example.dagger.ui.sidemenu.SidemenuView.<init>(SidemenuView.java:29) 
      at com.example.dagger.ui.sidemenu.SidemenuView.<init>(SidemenuView.java:21) 
            at java.lang.reflect.Constructor.constructNative(Native Method) 
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
            at android.view.LayoutInflater.createView(LayoutInflater.java:600) 
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:470) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
            at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.setMenu(SlidingMenu.java:375) 
            at com.example.dagger.ui.MainActivity.setupSidemenu(MainActivity.java:93) 
            at com.example.dagger.ui.MainActivity.onCreate(MainActivity.java:51) 
            at android.app.Activity.performCreate(Activity.java:5426) 
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
            at android.app.ActivityThread.access$900(ActivityThread.java:161) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:157) 
            at android.app.ActivityThread.main(ActivityThread.java:5356) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 

回答

1

所以,我从子模块去掉addsTo,加入complite=false, library=true到子模块和AppModule加入includes,现在它的工作原理。但我仍然不明白为什么它不像我以前那样工作。这样做的方式有点不方便,因为每次我实现新模块时,我需要转到AppModule并将此模块添加到所包含模块的列表中。它违反了开放/封闭原则,所以如果有一种方法可以用addsTo=AppModule.class添加新模块,我仍然感兴趣。

有什么建议吗? 谢谢。

0

为什么不注入SidemenuView在您的AppModule

+2

如果在一个模块中注入所有内容,将会很糟糕。就像把所有的类放在一个包里一样。 – 2015-02-07 13:49:16

0

我有同样的问题,我想我知道为什么会发生这种情况。通过includes,您可以为主添加子模块。用addsTo告诉IDE解析器您的子模块扩展了Appmodule,但您需要手动创建子图。

我不知道它是否足以从ObjectGraph.create(new Submodule());子模块创建一个新图形,它会自动包含用addsTo指定的父模块。 如果它不起作用,您需要手动创建一个子图parentGraph.plus(new Submodule())