2014-10-10 55 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())