我正在开发一款使用NavigationDrawer的应用。每当选择抽屉中的菜单项时,将不同的片段放入MainActivity
的内容视图中。
要通知MainActivity
已成功附加Fragment
以下回调:
public class CustomFragment extends Fragment {
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((MainActivity) activity).onSectionAttached();
}
}
由于我开始在项目中使用Otto和Dagger,我很好奇如何用.post()
事件替换回调,例如:
mBus.post(new CustomFragmentAttachedEvent);
问题是mBus
null
中onAttach()
为onCreate()
。它在@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyApp) getActivity().getApplication()).getObjectGraph().inject(this);
}
初始化。
NavigationDrawer
这是example of such a Fragment class。
参考文献:
您可以自己轻松尝试该示例:使用Android Studio中提供的 {{1}}模板创建新项目,添加 Dagger 和 Otto 并尝试替换上面提到的回调。
工作解决方案:
答案 0 :(得分:2)
您可以使用Otto
为Dagger
总线创建提供商,如下所示:
@Module(injects = {
YourFragment.class,
MainActivity.class
},complete = true)
public class EventBusModule {
@Provides
@Singleton
Bus provideBus() {
return new Bus();
}
}
然后在创建EventBusModule
时注册ObjectGraph
。您可以在Application
onCreate()
:
public class MyApplication extends Application{
public void onCreate() {
Object[] modules = new Object[]{new EventBusModule()};
Injector.init(modules);
}
}
您需要创建一个Injector
,其中包含一些静态方法和对ObjectGraph
的引用,因此您可以在不引用Application
的情况下对其进行操作。像这样:
public final class Injector {
private static ObjectGraph objectGraph = null;
public static void init(final Object... modules) {
if (objectGraph == null) {
objectGraph = ObjectGraph.create(modules);
}
else {
objectGraph = objectGraph.plus(modules);
}
// Inject statics
objectGraph.injectStatics();
}
public static final void inject(final Object target) {
objectGraph.inject(target);
}
public static <T> T resolve(Class<T> type) {
return objectGraph.get(type);
}
}
然后您只需在@Inject
中使用Fragment
让Dagger
为您提供Bus
个实例并注入Fragment
:
public class MyFragment extends Fragment{
@Inject Bus mBus;
public void onAttach(){
Injector.inject(this);
}
}