嗨,我是新來的匕首,並試圖用簡單的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)
如果在一個模塊中注入所有內容,將會很糟糕。就像把所有的類放在一個包裏一樣。 – 2015-02-07 13:49:16