在Android中向其他类注入视图

时间:2014-03-05 12:38:04

标签: android dependency-injection android-annotations dagger

我在我的项目AndroidAnnotations和Dagger中使用。

我想通过Dagger将View(通过AndroidAnnotations注入Activity)注入其他类。

现在我有了这段代码,但我希望ActionBarDrawerToggle获得@Injection

// MainActivity.java
@EActivity(R.layout.activity_main)
public class MainActivity extends ActionBarActivity {

    @ViewById
    DrawerLayout drawerLayout;

    ActionBarDrawerToggle mMainDrawerToggle;

    @AfterInject
    void daggerInject() {
        application.inject(this);
    }

    @AfterViews
    void setupViews() {
        mMainDrawerToggle = new ActionBarDrawerToggle(
                this,
                drawerLayout,
                R.drawable.ic_main_drawer,
                R.string.main_drawer_open,
                R.string.main_drawer_close);
    }
}

我已经做了类似的事情,但它不起作用,因为Dagger不知道如何获得DrawerLayout对象。

// ApplicationModule.java
@Module(
        library = true,
        injects = MainActivity_.class
)
public class ApplicationModule {

    private final MyApp application;

    public ApplicationModule(MyApp application) {
        this.application = application;
    }

    @Provides
    ActionBarDrawerToggle provideActionBarDrawerToggle(DrawerLayout drawerLayout) {
        return new ActionBarDrawerToggle(
                application,
                drawerLayout,
                R.drawable.ic_main_drawer,
                R.string.main_drawer_open,
                R.string.main_drawer_close);
    }
}

如何让Dagger注入ActionBarDrawerToggle

3 个答案:

答案 0 :(得分:0)

这似乎不是Activity本身的真正依赖 - Activity是从它自己的视图创建DrawerLayout的那个。

如果真的必须这样做,你可以创建一个自定义的ActivityModule,它在其构造函数中包含DrawerLayout或Activity依赖项。这样可以分享片段和子视图。

@Module(...)
public class ActivityModule {

  private final Activity activity;

  public ActivityModule(Activity activity) {
    this.activity = activity;
  }

  @Provides
  ActionBarDrawerToggle provideActionBarDrawerToggle() {
    //create the toggle and return it here
  }
}

答案 1 :(得分:0)

我知道我已经迟到了,但问题是你错过了@Inject之前的ActionBarDrawerToggle mMainDrawerToggle;注释

答案 2 :(得分:0)

除非您只有一项活动,否则您首先需要的是活动模块和活动组件here's how。接下来,您需要在执行匕首注入之前实例化切换。如果这适合你,那么:

为您的活动中的视图创建一个getter。然后在你的模块中:

@Provides @Singleton
  ActionBarDrawerToggle provideActionBarDrawerToggle() {
    activity.getActionBarDrawerToggle()
  }

现在你可以注入actionBarToggle,

 @Inject ActionBarToggle toggle;