2017-06-09 28 views
1

我正在尝试将MainActivity注入片段。我有一个在我的MainActivity中实现的接口,它将侦听来自Fragment的事件。所以我想注入MainActivity并在其上调用事件监听器。如何使用Dagger2将活动注入片段

我曾尝试做以下事情,但未能如愿。只显示代码片段。

接口

public interface RecipeItemListener { 
    void onRecipeItem(); 
} 

MainActivity实现接口

public class MainActivity extends AppCompatActivity implements RecipeItemListener { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if(savedInstanceState == null) { 
      getSupportFragmentManager() 
        .beginTransaction() 
        .add(R.id.main_fragment_container, RecipeListView.newInstance(), RecipeListView.TAG) 
        .commit(); 
     } 
    } 

    @Override 
    public void onRecipeItem() { 
     Timber.d("onRecipeItem"); 
    } 
} 

我的模块,它提供在MainActivity

@Module 
public class RecipeListModule { 
    private MainActivity mainActivity; 

    public RecipeListModule(MainActivity mainActivity) { 
     this.mainActivity = mainActivity; 
    } 

    @RecipeListScope 
    @Provides 
    public RecipeItemListener providesRecipeListMainActivity() { 
     return mainActivity; 
    } 
} 

我主要成分

@Singleton 
@Component(modules = { 
     AndroidModule.class, 
     NetworkModule.class}) 
public interface BusbyBakingComponent { 
    RecipeListComponent add(RecipeListModule recipeListModule); 
} 

我的子

@RecipeListScope 
@Subcomponent(modules = {RecipeListModule.class}) 
public interface RecipeListComponent { 
    void inject(RecipeListView target); 
} 

我的应用程序类

public class BusbyBakingApplication extends Application { 
    private BusbyBakingComponent applicationComponent; 
    private RecipeListComponent recipeListComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     applicationComponent = createApplicationComponent(); 
    } 

    public BusbyBakingComponent createApplicationComponent() { 
     return DaggerBusbyBakingComponent.builder() 
       .networkModule(new NetworkModule()) 
       .androidModule(new AndroidModule(BusbyBakingApplication.this)) 
       .build(); 
    } 

    public BusbyBakingComponent getApplicationComponent() { 
     return applicationComponent; 
    } 

    public RecipeListComponent createRecipeListComponent(MainActivity activity) { 
     recipeListComponent = applicationComponent.add(new RecipeListModule(activity)); 
     return recipeListComponent; 
    } 

    public void releaseRecipeListComponent() { 
     recipeListComponent = null; 
    } 
} 

,在我的片段,这是如何,我试图注入:

@Inject MainActivity mainActivity; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ((BusbyBakingApplication)getActivity().getApplication()) 
      .createRecipeListComponent((MainActivity)getActivity()) 
      .inject(RecipeListView.this); 
} 

我不断收到以下错误:

Error:(14, 8) error: [me.androidbox.busbybaking.di.RecipeListComponent.inject(me.androidbox.busbybaking.recipieslist.RecipeListView)] me.androidbox.busbybaking.recipieslist.MainActivity cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. 
me.androidbox.busbybaking.recipieslist.MainActivity is injected at 
me.androidbox.busbybaking.recipieslist.RecipeListView.mainActivity 
me.androidbox.busbybaking.recipieslist.RecipeListView is injected at 
me.androidbox.busbybaking.di.RecipeListComponent.inject(target) 

非常感谢您的任何建议。

+2

难道你不使用'getActivity()'获得片段中的活动吗?修复工作的 – EpicPandaForce

回答

1

如果你看一下你的模块

@RecipeListScope 
@Provides 
public RecipeItemListener providesRecipeListMainActivity() { 
    return mainActivity; 
} 

您提供的接口(这是好的)而不是MainActivity(实现)。

既然你要求MainActivity

@Inject MainActivity mainActivity; 

您收到此错误:

MainActivity cannot be provided [...]

,因为你只提供RecipeItemListener


从需要在RecipeListViewMainActivity切换你的代码

@Inject RecipeItemListener recipeListener; 

,它应该工作,如果你设置的其余部分是正确的。

+0

。我想要插入的原因是我想调用MainActivity中的方法,该方法从Activity所托管的片段实现接口。我想我可以将Activity传递给onAttach方法中的片段。但是,我认为注射是更好的方法。 – ant2009

0

您可以在片段使用getActivity(访问活动),并将其投放到您的接口听众这样

((RecipeItemListener)getActivity()).doSomethingOnListener() 

简单得多,没有任何不必要的注射